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

目录

(壹) 字符指针 

  1.1 基础知识

  1.2 面试题

(贰) 数组指针

   2.1 数组指针的定义

   2.2 &数组名 VS 数组名

   2.3  数组指针的使用 


✅《C游记》 专栏 ✅  《小玄的C游之旅》


(壹) 字符指针 

  1.1 基础知识

在指针的类型中我们知道有一种指针类型为字符指针char*;

一般使用:

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


还有一种使用方式如下: 

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


代码char* pstr = "hello bit.";

特别容易让同学以为是 把字符串hello bit 放到字符指针pstr里了

但是 本质是把字符串hello bit.首字符的地址放到了pstr中。 


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

上面代码的意思是把一个  常量字符串  的首字符h的地址存放到指针变量pstr中。 


  1.2 面试题

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


这里最终输出的是: 

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

这里  str3    str4  指向的是一个同一个常量字符串。

C/C++会把常量字符串存储到单独的一个内存区域

当几个指针,指向同一个字符串的时候,他们实际会指向同一块内存

但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。

所以str1和str2不同,str3和str4不同。 


(贰) 数组指针

   2.1 数组指针的定义

数组指针是指针?还是数组?

答案是:指针。

我们已经熟悉:

整形指针:int * pint -- 能够指向整形数据的指针。

浮点型指针:float * pf -- 能够指向浮点型数据的指针。

那数组指针应该是:能够指向数组的指针。

下面代码哪个是数组指针?


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

 解释:

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


   2.2 &数组名 VS 数组名

对于下面的数组:

arr    &arr  分别是啥? 

我们知道arr是数组名,数组名表示数组首元素的地址。

那&arr数组名到底是啥?


我们看一段代码:

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

运行结果如下:

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


可见数组名和&数组名打印的地址是一样的。

难道两个是一样的吗?

我们再看一段代码:

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


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

根据上面的代码我们发现,其实&arr和arr,虽然值是一样的,但是意义应该不一样的。 

实际上:&arr表示的是数组的地址,而不是数组首元素的地址。

(细细体会一下)

数组的地址+1,跳过整个数组的大小,所以&arr+1相对于&arr的差值是40.


  2.3  数组指针的使用 

那数组指针是怎么使用的呢?

既然数组指针指向的是数组,那数组指针中存放的应该是数组的地址。

看代码:

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


一个数组指针的使用: 

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


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


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


  2.4  小结

学了指针数组和数组指针我们来一起回顾并看看下面代码的意思:

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


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


 

你可能感兴趣的:(C游记,c语言,开发语言,后端)