@(C語言)
[toc]
指針:指針變量存儲的是變量類型對應(yīng)的變量的值
&(取地址符)
&:是一個操作符吴侦,運用在內(nèi)存中的對象上面鳍置,即變量或者數(shù)組元素识补。
*(間接尋址符)
或者叫:引用運算符
表示指針指向蹂安。
int * p;
p 是一個指針變量名
*p 是從p指針變量中取出一個int型數(shù)據(jù)
指針
int i =10;
//int型的指針變量 *p 存儲的是 int型的數(shù)據(jù)的變量的地址
int *p;
p =&i;
printf("i 的值: %d \n",i);
printf("i 的地址: %#X \n",&i);
printf("p 的值: %#X \n",p);
printf("p 的地址: %#X \n ",&p);
輸出:
i 的值: 10
i 的地址: 0XEFBFF5AC
p 的值: 0XEFBFF5AC
p 的地址: 0XEFBFF5A0
所以:&是指向變量的地址
*是指向&變量的地址
指針的定義與運算
int a =10;
int *p =&a;
*p = *p+10;
printf("p: %#X, a: %d \n",p,a);
int y = 1+*p;
printf("y: %d \n",y);
*p += 1;
printf("p: %#X, a: %d \n",p,a);
(*p)++;
printf("p: %#X, a: %d \n",p,a);
*p++;
printf("p: %#X, a: %d \n",p,a);
輸出:
p: 0XEFBFF5AC, a: 20
y: 21
p: 0XEFBFF5AC, a: 21
p: 0XEFBFF5AC, a: 22
p: 0XEFBFF5B0, a: 22
指針運算:
*p 代表是它所指的地址上面的值的運算
p++ 是p 指針變量++,結(jié)果就是:p指向它的下一個地址
數(shù)組與指針
數(shù)組名就是數(shù)組的首地址
//數(shù)組名就是數(shù)組的首地址
int a[5]={1,2,3,4,5};
int *p =a ;
int z=3;
printf("%#X \n",a);
//a+5表示a移動到數(shù)組的第五個位置
for (int i=0; p<a+5; p++) {
*p =z;
}
for (int i =0; i<5; i++) {
printf("%d \n",a[i]);
}
輸出:
0XEFBFF5A0
3
3
3
3
3
指針與函數(shù)參數(shù)
void swap(int *a ,int *b){
int temp =*a;
*a =*b;
*b =temp;
}
int x =10;
int y =20;
swap(&x, &y);
printf("x: %d \n",x);
printf("y: %d \n",y);
輸出:
x: 20
y: 10
指針數(shù)組與數(shù)組指針
char * name[] ={"hello","baby","dink","love"};
//那么name就是個指針數(shù)組
char (*name)[] ={"hello","baby","dink","love"};
//name是數(shù)組指針彰阴,指向數(shù)組的首地址
二級指針
//二級指針存的內(nèi)容是一級指針的地址
// p的值就是p的這個變量躯喇,這個變量保存的是a 的地址
//*p運算,得到的就是a的值
//*p2運算,得到的就是p的值
//**p2運算硝枉,得到的就是p的值的*運算得到的值 a廉丽;
int a =100;
int * p;
p =&a ;
int **p2;
p2 =&p;
// **p 的值是a--> *P2==P --->**P2==*P==a
函數(shù)指針
函數(shù)在內(nèi)存中存儲就是一段地址,而函數(shù)名就是這段地址的首位妻味。
//
int plus(int a,int b){
return a+b;
}
//返回類型+參數(shù)類型
int (*calc)(int a,int b);
calc =plus;
int result =calc(3,5);
printf("result :%d \n",result);