码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-06-13 11:23:54      阅读:143      评论:0      收藏:0      [点我收藏+]

标签: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));

结果:

技术分享

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)则不会。

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

标签:c++基础   指针   字符数组   内存   

原文地址:http://blog.csdn.net/wxc237786026/article/details/46448555

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!