您的位置:首页 > 编程语言 > C语言/C++

指针进阶(一)(详细讲解1,2,3)(零基础学习C语言)

2021-02-17 20:56 796 查看

内容:

注意:
数组名是搜元素的地址
就算是用数组接受,本质上接受的还是地址
地址就是指针,指针的大小取决于32位平台还是64位平台
但是int类型的数组元素的大小就是int类型的
所以sz有两种可能1(32位平台)或2(64位平台)

初阶指针内容

一,字符指针
用法一:
用来存放字符变量的地址

用法二:
打印字符数组内容
直接用%s加数组首元素地址即可
根据字符串数组地址找到存储的内容,用%s打印字符串内容
pc里面存放的正是数组首元素地址所以可以直接pc

用法四:
指针变量中储存的是字符a的地址(即字符串的首字符地址)

分析:
指针里存储的是字符串的首字符地址
根据这个字符串的首字符地址找到存储的内容
根据这个存储的字符串内容进行打印

注意:
这种写法是错误的
指针里存储的是字符串的首字符地址
将指针内容改成别的字符地址
那根据改变后的地址将找不到之前的字符窜

最好加上const
如果进行p变量的修改时会报错

推荐两个技术问答社区的网站

推荐一本特别经典的书:
《剑指offer》
牛客网的剑指offer的编程题

重要例题讲解:

输出的是haha不是hehe
两个数组是不同的空间进行存储的,所以两个数组的首元素的地址是不同的

输出的是hehe不是haha
两个常量字符串一模一样,不能进行修改,所以abcdef是用同一块空间存储的
两个指针指向的都是这块空间中a的地址
所以指针p1 , p2 中储存的地址相同
分析:

好的代码习惯:
将存储字符常量的变量前加个const

总结:
1.常量字符串不可修改,存储在一块空间中
2.存储在变量里的字符串可以修改,存储在不同的空间中
3.字符存放在字符数组中的是可以修改的,每个字符存放在相应的字符变量所对应的空间中
4.而存放在字符指针中是不可修改的,是常量字符串,指针里存储的是字符串的首字符地址
二,指针数组
[]的优先级要高于*
所以int* parr[10];为指针数组
定义指针数组变量的时候,[10]说明parr是数组,*说明这个数组是指针,数组的元素个数是10个,int*说明数组的每个指针变量的类型是int*
注意:
arr存放的是数组首元素的地址



指针数组存放的是相同类型变量的地址


指针数组的使用:
方法一:(不常用)

方法二:(实现多维数组)

结果:

分析:

三,数组指针
指向数组的指针

&arr存放的是整个数组的地址
[]的优先级要高于*
所以int* parr[10];为指针数组
int(*parr)[10];为数组指针
定义变量的时候,*说明parr是指针[10]说明是数组,数组的元素个数是10个,int说明指针指向的数组的类型是int




解析:

总之:

&arr和arr的区别主要是:

数组指针的使用:
方法一:(不常用)


方法二:
参数是数组的形式
最常见的一种方式,打印二维数组

解析:
参数是指针的形式
将二维数组arr想象为一个一维指针数组
存放的是二维数组每一行的首元素的地址,
传参的时候传递的是第一行的首元素的地址

根据p+i找到每一行的首元素地址
*(p+i)加一颗*表示,指向每一行的首元素地址后面的内容,相当于知道了一维数组首元素的地址
(*(p+i)+j)相当于根据每一行的首元素地址向后指向每一行中后面的地址
*(*(p+i)+j)解引用操作,根据地址找到地址所指向的内容
相当于(*(p+i))[j]


因为:

类比推得:

总结:

分析:
int(*)[5]是数组类型
parr3[10]是一个有10个元素的数组,每一个元素都指向一个有5个int类型元素的数组

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: