学习C语言,都会对指针又爱又恨,爱它的功能强大,恨他难以理解~~
为了深刻理解指针的艺术,故而总结一下
指针 其实就是指向的地址,所以从变量,数组看内存分配。
#include<stdio.h>
int main(){
int x = 100;
printf("x的地址为:%p\n",&x);
printf("x的值为:%d\n",x);
return 0;
}
如图,地址为0043FB94的内存里面存放的值为100
一维数组:
#include<stdio.h>
int main(){
int arr[5];
for(int i=0; i<5; i++){
scanf("%d",&arr[i]);
}
for(int i=0; i<5; i++){
printf("%d\n",arr[i]);
}
for(int i=0; i<5; i++){
printf("arr[%d]的地址为:%p\n",i,&arr[i]);
}
return 0;
}
注意下数组各元素地址之间的关系:每个之间差为4字节,正好是int的大小
如果我的数组的数据类型是double 那么地址之差就是8字节~
另外,数组地址也可以这样表示
Arr表示数组的首地址,
for(int i=0; i<5; i++){
printf("arr[%d]的地址为:%p\n",i,arr+i);
}
二维数组:
#include<stdio.h>
int main(){
int arr[2][3] = {1,2,3,4,5,6};
for(int i=0; i<2; i++){
for(int j=0; j<3; j++){
printf("arr[%d][%d]的地址:%p\n",i,j,&arr[i][j]);
}
}
for(int i=0; i<2; i++){
printf("arr[%d]的地址为:%p\n",i,&arr[i]);
}
for(int i=0; i<2; i++){
printf("arr[%d]的地址为:%p\n",i,arr+i);
}
}
规律:arr[0] arr+0的地址相同 都表示arr[0][0]
那如果他们都+1呢,表示的是不是还一样?
继续上代码:
#include<stdio.h>
int main(){
int arr[2][3] = {1,2,3,4,5,6};
for(int i=0; i<2; i++){
for(int j=0; j<3; j++){
printf("arr[%d][%d]的地址:%p\n",i,j,&arr[i][j]);
}
}
for(int i=0; i<2; i++){
printf("arr+%d的地址为:%p\n",i,arr+i);
}
for(int i=0; i<3; i++){
printf("arr[0]+%d的地址为:%p\n",i,arr[0]+i);
}
}
发现arr+1所表示的是&arr[1][0]
Arr[0]+1所表示的是&arr[0][1]