总结了C语言中指针的相关操作,为便于理解,建议逐句比较,有问题也麻烦帮忙指正。
#include<stdio.h>
int main(){
int i,j,s[3]={1,2,3};
///1、用指针访问一维数组
int *p=s; ///p是一个指向元素类型为整数的数组的指针
for(i=0;i<3;i++){
///printf("%d %x\n",s[i],&s[i]);///输出数组每个元素的内容以及每个元素所在的位置
///printf("%d %x\n",*(s+i),s+i);
///printf("%d %x\n",p[i],&p[i]);
///printf("%d %x\n",*(p+i),p+i);
///printf("%d %x\n",*p,p);p++;
}
///2、用定长指针访问一维数组
int (*pp)[3]=s; ///pp是一个指针,指向一个含有3个整数元素的数组
///pp的每个元素都占用3个int的空间,即3*4=12byte
///初始地址被设置为数组s的首地址,
///假设s初始地址为0x0000,pp[0]指向0x000c,pp[1]指向0x0018
///查看地址占用情况
for(i=0;i<4;i++){
///printf("%x\n",pp[i]);
}
for(i=0;i<3;i++){
///printf("%d %x\n",pp[0][i],&pp[0][i]);///仅有三个元素,只能从pp[0]开始
///pp[1]就会跳过数组存放的地理位置
}
int s1[3][3]={1,2,3,4,5,6,7,8,9};///s1[][3];一维可以省略,但是二维不可以,一维省略了,
///编译器可以用总数除以二维的长度,确定一维。如果,
///二维省略了,编译器无法知道如何去分配,导致发生错误。
///3、用一维指针访问二维数组
int *p2=s1;
for(i=0;i<9;i++){
///printf("%d %x\n",*p2,p2);p2++;///二维数组在内存中也是顺序存放,位置相邻
///printf("%d %x\n",p2[i],&p2[i]);
///printf("%d %x\n",*(p2+i),p2+i);
///printf("%d %x\n",*p2,p2++);///!!!程序会首先执行p2++,之后在进行输出,与上面的输出结果不同
}
///4、用定长指针访问二维数组
int (*p1)[3]=s1;
for(i=0;i<3;i++){
for(j=0;j<3;j++){
///printf("%d %x\n",s1[i][j],&s1[i][j]);
///printf("%d %x\n",*(*(s1+i)+j),(*(s1+i)+j));
///printf("%d %x\n",p1[i][j],&p1[i][j]);
///printf("%d %x\n",*(p1[i]+j),(p1[i]+j));
///printf("%d %x\n",*(*(p1+i)+j),(*(p1+i)+j));
}
}
///5、指针数组
int *b[2];///数组b含有2个元素每个元素,每个元素都是指向int类型的指针
b[0]=s; ///第一个指针元素指向一维数组s
b[1]=s1; ///第二个元素指向二维数组s1
for(i=0;i<3;i++){
///printf("%d %x\n",b[0][i],&b[0][i]); ///借助指针数组元素访问s
}
for(i=0;i<9;i++){
///printf("%d %x\n",b[1][i],&b[1][i]); ///借助指针数组元素访问s1
}
return 0;
}