学习篇:C语言数组与指针
指针
讲C语言的书都会说:
int *p;
语句声明了一个整形指针p,p中存放了一个地址。
实际上,申明之后,相当于告诉编译器内存的分配方式,编译器就以该地址为起始地址的连续4个内存空间被打包在一起存储一个整形数据。所以执行:
std::cout<<p<<'/t'<<p+1;
后,会发现前后两个值的差为4,即等于整形被分配的字节数。计算p+1时,该值指向的内存地址是下一个打包区域的起始地址,即为一次性跳过4字节的下一个内存区域。
大家觉得指针被分配了多大的内存空间?
std::<<sizeof(p);
结果是4,有人说,因为地址总线的宽度为4*8=32位。咦?我的电脑不是64位的么?确实,但64位的CPU64位的电脑可以运行32位的程序,上述的结果和你的编译器有关。
数组
int p[5] = {32,45,12,56,77};
std::cout<<"\nP:"<<P;
std::cout<<"\n*p:"<<*P;
std::cout<<"\np[1]:"<<p[1];
std::cout<<"\n1[p]"<<1[p];
std::cout<<"\n*(p+1)"<<*(p+1);
std::cout<<"\n*(1+p)"<<*(1+p);
执行上述语句的结果为:
p: 00CFF874
*p: 32
p[1]: 45
1[p]: 45
*(p+1): 45
*(1+p): 45
数组名即为指向该数组空间的指针。可以通过第一个输出看到,输出的结果为该数组所在内存空间的起始地址。
对于编译器来说,p[i]和 *(p+i) 是完全等价的。
编译器对p[i]的处理也是转化为 *(p+i)来执行的。
因此运用加法交换律,*(i+p)可以顺利执行,i[p]也完全不会出错。也就是说,你写成2[p],0[p]是完全正确的。