c語言的指針
『壹』 關於c語言的指針
這個程序的指針變數經過p=&q,等於把變數q的地址賦給了指針變數p!也就意味著!這兩個變數代表著同一個地址單元的不同形式,p是地址,q是該地址存儲的值!利用scanf(「%d」,p) 與scanf(「%d」,&q) 是一樣的!那麼底下列印語句,列印的是q,因此是變數的值,不是地址!如果想列印地址,可把q換成p!
還有書上是寫出來的,有可能出錯!到計算機運行程序!是不會出錯的!一切以計算機運行出來的為准! 出現書上的和運行出的結果不同!計算機為准!通過分析!可以學到不少東西!
『貳』 c語言中指針怎麼使用
1、使用場景
使用指針時,必須將它指向一個變數的地址或者為它分配空間方能使用,如下所示:
#include<stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
int a[5]={0,1,2,3,4};
int *b,*d;
int c=2;
int *e=a; //e指向a數組首地址
//*b=2; 無法直接初始化
//printf("%d ", *b);
e=e+2; //移動兩個地址單元
d=&c; //d指向c的地址來表示值
c=4; //修改原c變數的值,d指針的值會發生改變
b=(int *)malloc(sizeof(int));//為b分配一個int型空間來直接存儲值
*b=2;//分配空間後可以直接賦值了
printf("this is e,b,c,d :%d %d %d %d ",*e,*b,c,*d);
2、類型說明
(1)int *a :表示一個指向int型變數的指針,指向的是變數的地址單元
(2)char *b:表示一個指向char變數的指針
*a表示的是這個指針指向地址的值,a為此指針本身的地址,這點要明確,一般用*(a+1)、*(a+2)來表示值,如:
int nums[5]={0,1,2,3,4};
int *a=nums;
printf("%d %d %p ",*a,*(a+1),a);
(2)c語言的指針擴展閱讀:
指針的運算
指針指向變數地址,若原變數的內容發生了變化,它本身也會發生變化,指針之間的運算一般為值運算和地址運算
(1)值運算:直接通過*運算方式,像a+*(a+1),結果為第一個元素與第二個元素相加。
int nums[5]={0,1,2,3,4};
int *a=nums;
(2)地址運算:通過a+i的方式.指針會指向a的下i個地址。
int nums[5]={0,1,2,3,4};
int *a=nums;
a=a+2;
printf("%d ",*a);
結果輸出2。
參考資料來源 :指針-網路
『叄』 C語言 指針方法
#include<stdio.h>
int main()
{
int a,b,c,s[3],t;
int *x,*y,*z;//定義指針變數
x=&a;//將a的地址賦給指針x,下同
y=&b;
z=&c;
scanf("%d%d%d",x,y,z);
s[0]=*x;//將指針x所指向的變數值賦給數組s的第一個元素;依次類推
s[1]=*y;
s[2]=*z;
for(int i=0;i<3;i++)//冒泡排序
for(int j=0;j<3-i-1;j++)
if(s[j]<s[j+1])
{
t=s[j];
s[j]=s[j+1];
s[j+1]=t;
}
for(int i=0;i<3;i++)
printf("%d ",s[i]);
return 0;
}
『肆』 c語言指針
變數賦值 是得到副本,如
t=a;
a=b;
b=t;
指針 則是指向同一個內存地址
因而獲得內存裡面的內容
如後者
『伍』 c語言,指針
#include<stdio.h>
void input(int *a,int n)
{int i;
for(i=0;i<10;i++)
scanf("%d",a+i);
}
void output(int *a,int n)
{int i;
for(i=0;i<10;i++)
printf("%d ",*(a+i));
printf("\n");
}
void fun(int *a,int n)
{int i,j,max,min,t;
max=min=0;
for(i=1;i<n;i++)
if(a[i]>a[max])max=i;
else if(a[i]<a[min])min=i;
t=a[0];a[0]=a[min];a[min]=t;
if(max==0)max=min;
t=a[n-1];a[n-1]=a[max];a[max]=t;
}
int main()
{ int i,j,a[10];
input(a,10);
fun(a,10);
output(a,10);
return 0;
}
『陸』 C語言指針
在循環里, 可以看出 p[2]=&a[2*4], 所以 p[2]=&a[8]
也就是說p[2]是指向a數組中第9個元素的指針
p[2]+1就是將指針向後移動一個單位, 即指向a數組第10個元素(相當於&a[9])
括弧前面的星號是從地址中取得對應值, 也就是10
『柒』 C語言指針
fun函數在這里相當於什麼也沒干
雖然fun的參數列表是兩個指針, 但是按址傳遞的時候, 能夠互換的是地址所指向的變數, 而不是地址本身
a/b 也是變數(指針類型), 在fun里, a/b兩個值自己交換了, a/b對於所指向的int來說是按址傳遞, 但是按照指針來說還是按值傳遞, 原來地址所指向的內容(int值)並沒有發生變化, 所以輸出還是那樣
『捌』 c語言指針是什麼意思!
指針其實是一個整形變數,與其它數據不同的是,它的作用是用來存儲其它變數的地址。指針(Pointer)是編程語言中的一個對象,利用地址,它的值直接指向(points to)存在電腦存儲器中另一個地方的值。由於通過地址能找到所需的變數單元,可以說,地址指向該變數單元。
因此,將地址形象化的稱為「指針」。意思是通過它能找到以它為地址的內存單元。
再打個比方:有個人讓你去麥當勞幫我買個雪糕,那麼麥當勞是這個變數a,但是那個人現在把麥當勞所在的地址寫在紙上給你,那麼這張紙就可以看做一個指向麥當勞的指針。
(8)c語言的指針擴展閱讀:
舉例說明:
int p; //這是一個普通的整型變數。
int *p; //首先從P 處開始,先與*結合,所以說明P 是一個指針,然後再與int 結合,說明指針所指向的內容的類型為int 型.所以P是一個返回整型數據的指針。
int p[3]; //首先從P 處開始,先與[]結合,說明P 是一個數組,然後與int 結合,說明數組里的元素是整型的,所以P 是一個由整型數據組成的數組 。
int *p[3]; //首先從P 處開始,先與[]結合,因為其優先順序比*高,所以P 是一個數組,然後再與*結合,說明數組里的元素是指針類型,然後再與int 結合,說明指針所指向的內容的類型是整型的,所以P 是一個由返回整型數據的指針所組成的數組。
int (*p)[3]; //首先從P 處開始,先與*結合,說明P 是一個指針然後再與[]結合(與"()"這步可以忽略,只是為了改變優先順序),說明指針所指向的內容是一個數組,然後再與int 結合,說明數組里的元素是整型的.所以P 是一個指向由整型數據組成的數組的指針。
int **p; //首先從P 開始,先與*結合,說是P 是一個指針,然後再與*結合,說明指針所指向的元素是指針,然後再與int 結合,說明該指針所指向的元素是整型數據。由於二級指針以及更高級的指針極少用在復雜的類型中,所以後面更復雜的類型就不考慮多級指針了,最多隻考慮一級指針。
int p(int); //從P 處起,先與()結合,說明P 是一個函數,然後進入()里分析,說明該函數有一個整型變數的參數,然後再與外面的int 結合,說明函數的返回值是一個整型數據。
Int (*p)(int); //從P 處開始,先與指針結合,說明P 是一個指針,然後與()結合,說明指針指向的是一個函數,然後再與()里的int 結合,說明函數有一個int 型的參數,再與最外層的int 結合,說明函數的返回類型是整型。
所以P 是一個指向有一個整型參數且返回類型為整型的函數的指針。
int *(*p(int))[3]; //可以先跳過,不看這個類型,過於復雜從P 開始,先與()結合,說明P 是一個函數,然後進入()裡面,與int 結合,說明函數有一個整型變數參數,然後再與外面的*結合,說明函數返回的是一個指針。
然後到最外面一層,先與[]結合,說明返回的指針指向的是一個數組。然後再與*結合,說明數組里的元素是指針,然後再與int 結合,說明指針指向的內容是整型數據.所以P 是一個參數為一個整數據且返回一個指向由整型指針變數組成的數組的指針變數的函數.