天天看点

指针和数组——高质量C、C++编程指南

本文内容出自《高质量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));

结果:

指针和数组——高质量C、C++编程指南

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);

结果:

指针和数组——高质量C、C++编程指南

可以看出,虽然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);

结果:

指针和数组——高质量C、C++编程指南

可以看到,通过pStr[0]和*pStr来改变数组内容。

4、数组对应的是一块内存区域,指针是指向一块内存区域。所以数组是不能通过自加来指向下一元素,而指针可以。

指针和数组——高质量C、C++编程指南

当对数组名使用自加(++str)取下一元素时是会报错的,而指针自加取下一元素(++pStr)则不会。

继续阅读