本文内容出自《高质量C、C++编程指南》,通过阅读之后整理和总结,并用例子证明。
数组:在静态存储区创建或者栈上创建。数组名对应着一块内存,其地址与容量在生命周期内保持不变,只有数组的内容可以改变。
指针:随时指向任意类型的内存块,特征是“可变”,所以指针可以用来操作动态内存。
1、数组和指针的大小。
char str[] = "hello";
char* pStr = "hello";
int* pInt = nullptr;
printf("str len = %d\n", sizeof(str));
printf("pStr len = %d\n", sizeof(pStr));
printf("pInt len = %d\n", sizeof(pInt));
结果:
str长度为6,因为存放的内容为"hello\0",这里有个‘\0‘结束符。
pStr和pInt虽为不同类型指针,但是都为4。所以说数组的长度取决于内容,指针的长度一律固定为4。
2、数组的内容和指针指向的内容虽然一样,但是内容存放地址不一样。
char str[] = "hello";
printf("str address = %d\n", str);
char* pStr = "hello";
printf("pStr address = %d\n", pStr);
char* pStr2 = "hello";
printf("pStr2 address = %d\n", pStr2);
结果:
可以看出,虽然str的内容和pStr指向的内容一样,但是内容的地址不一样。
str存放的hello是在栈上,数组开辟内存空间来存放,所以可以对内容进行修改,如果str[0]=‘x‘,这样str的输出就是xello。
而指针是指向内存的,"hello"此时存放在静态存储区中。其中pStr和pStr2所输出的地址是一样的。因为"hello"处于静态存储区中,所以不能修改,pStr[0]=‘x‘会导致运行时错误。
3、上面说到不能通过pStr[0]来修改指向内容,因为"hello“是字符串常量。但如果pStr指向数组的话,是可以通过指针来修改数组内容的。
char str[] = "hello";
char* pStr = str;
str[0] = ‘a‘;
printf("str = %s\n", str);
printf("pStr = %s\n", pStr);
pStr[0] = ‘b‘;
printf("str = %s\n", str);
printf("pStr = %s\n", pStr);
*pStr = ‘c‘;
printf("str = %s\n", str);
printf("pStr = %s\n", pStr);
结果:
可以看到,通过pStr[0]和*pStr来改变数组内容。
4、数组对应的是一块内存区域,指针是指向一块内存区域。所以数组是不能通过自加来指向下一元素,而指针可以。
当对数组名使用自加(++str)取下一元素时是会报错的,而指针自加取下一元素(++pStr)则不会。
原文地址:http://blog.csdn.net/wxc237786026/article/details/46448555