C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)

【C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)】

目录
(壹) 字符指针
1.1 基础知识
1.2 面试题
(贰) 数组指针
2.1 数组指针的定义
2.2 &数组名 VS 数组名
2.3数组指针的使用
?《C游记》 专栏 ?《小玄的C游之旅》
(壹) 字符指针 1.1 基础知识 在指针的类型中我们知道有一种指针类型为字符指针char*;
一般使用:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

还有一种使用方式如下:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

代码char* pstr = "hello bit.";
特别容易让同学以为是 把字符串hello bit 放到字符指针pstr里了 ,
但是 本质是把字符串hello bit.首字符的地址放到了pstr中。
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

上面代码的意思是把一个常量字符串的首字符h的地址存放到指针变量pstr中。
1.2 面试题 C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

这里最终输出的是:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

这里str3和str4指向的是一个同一个常量字符串。
C/C++会把常量字符串存储到单独的一个内存区域
当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存。
但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
所以str1和str2不同,str3和str4不同。
(贰) 数组指针 2.1 数组指针的定义 数组指针是指针?还是数组?
答案是:指针。
我们已经熟悉:
整形指针:int * pint -- 能够指向整形数据的指针。
浮点型指针:float * pf -- 能够指向浮点型数据的指针。
那数组指针应该是:能够指向数组的指针。
下面代码哪个是数组指针?
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

解释:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

2.2 &数组名 VS 数组名 对于下面的数组:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

arr和&arr分别是啥?
我们知道arr是数组名,数组名表示数组首元素的地址。
那&arr数组名到底是啥?
我们看一段代码:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

运行结果如下:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

可见数组名和&数组名打印的地址是一样的。
难道两个是一样的吗?
我们再看一段代码:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。
实际上:&arr表示的是数组的地址,而不是数组首元素的地址。
(细细体会一下)
数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是40.
2.3数组指针的使用那数组指针是怎么使用的呢?
既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。
看代码:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

一个数组指针的使用:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

2.4小结
学了指针数组和数组指针我们来一起回顾并看看下面代码的意思:
C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片

C游记|《C游记》 第柒章 - 指针进阶内功锻 功成行满见真如(壹)
文章图片




    推荐阅读