本文主要是介绍(第23章)LinuxC本质中指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 一、指针的基本概念
- 1.&是取地址运算符
- 2.*是取指针所指向变量的值
- 3.指针之间可以相互赋值
- 4.野指针
- 5.空指针
- 5.void *的简介:常用做函数接口
- 二、指针类型的参数和返回值
- 三、指针与数组
- 1.指针与数组的关系
- 2.指针的比较
- 3.参数是数组,等价于参数是指针的形式
- 四、指针与const运算符
- 1.const在指针上的所有用法总结
- 2.为啥要使用const
- 3.字符串字面值通常分配在.rodata段,类似于数组名
- 五、指针与结构体
- 六、指向指针的指针与指针数组
- (1)指向指针的指针
- (2)指针数组
- (3)为什么main函数的标准原型是int main(int argc, char *argv[])??
- 七、指向数组的指针与多维数组
- 八、函数指针和函数指针类型
- 九、不完全类型和复杂声明
一、指针的基本概念
1.&是取地址运算符
(1)
- 堆栈有栈顶指针,队列有头指针和尾指针,这些概念中的“指针”本质上是一个整数,是数组的索引,通过指针访问数组中的某个元素
- 把一个变量所在的内存单元的地址保存在另外一个内存单元中,保存地址的这个内存单元称为指针,通过指针和间接寻址访问变量
(2)eg
- 这里的&是取地址运算符(Address Operator) , &i表示取变量i的地址, int *pi = &i;表示定义一个指向int型的指针变量pi,并用i的地址来初始化pi
- 注意pi和pc虽然是不同类型的指针变量,但它们的内存单元都占4个字节,因为要保存32位的虚拟地址,同理,在64位平台上指针变量都占8个字节。
2.*是取指针所指向变量的值
(1)*号通常和类型int之间留空格而和变量名写在一起,这样看int *p, q;就很明显是定义了一个指针和一个整型变量,就不容易看错了
(2)eg
(3)&运算符和*运算符小总结
- &运算符的操作数必须是左值,因为只有左值才表示一个内存单元,才会有地址,运算结果是指针类型
- *运算符的操作数必须是指针类型,运算结果可以做左值
3.指针之间可以相互赋值
4.野指针
- 有一种情况需要特别注意,定义一个指针类型的局部变量而没有初始化:
5.空指针
5.void *的简介:常用做函数接口
- 在编程时经常需要一种通用指针,可以转换为任意其它类型的指针,任意其它类型的指针也可以转换为通用指针
二、指针类型的参数和返回值
eg如下:
(1)指针类型的参数
(2)指针类型的变量
三、指针与数组
1.指针与数组的关系
(1)eg
- 继续画图理解
- 既然指针可以用++运算符,当然也可以用+、 -运算符, pa+2这个表达式也是有意义的,如上图所示, pa指向a[1],那么pa+2指向a[3]。事实上, E1[E2]这种写法和(*((E1)+(E2)))是等价的, *(pa+2)也可以写成pa[2]
- a[2]之所以能取数组的第2个元素,是因为它等价于*(a+2),数组名做右值时自动转换成指向首元素的指针,所以a[2]和pa[2]本质上是一样的
- 由于a做右值使用时和&a[0]是一个意思,所以int *pa = &a[0];通常不这么写,而是写成更简洁的形式int *pa = a;
- 数组名做右值时转换成指向首元素的指针,但做左值仍然表示整个数组的存储空间,而不是首元素的存储空间,数组名做左值还有一点特殊之处,但支持取地址运算符&,所
以&a是合法的
2.指针的比较
(1)现在猜一下,两个指针变量做比较运算(>、 >=、 <、 <=、 ==、 !=)表示什么意义?两个指针变量做减法运算又表示什么意义?
(2)所以指针之间的比较运算比的是地址, C语言正是这样规定的,不过C语言的规定更为严谨,只有指向同一个数组中元素的指针之间相互比较才有意义,否则没有意义。
(3)指针相减表示两个指针之间相差的元素个数(注意差值是地址,还需要除以元素类型的大小sizeof),同样只有指向同一个数组中元素的指针之间相减才有意义
(4)因此C语言也规定两个指针不能相加。
3.参数是数组,等价于参数是指针的形式
四、指针与const运算符
1.const在指针上的所有用法总结
2.为啥要使用const
3.字符串字面值通常分配在.rodata段,类似于数组名
五、指针与结构体
六、指向指针的指针与指针数组
(1)指向指针的指针
(2)指针数组
- 例如定义一个数组a由10个元素组成,每个元素都是int *指针:
(3)为什么main函数的标准原型是int main(int argc, char *argv[])??
-
argc是命令行参数的个数
-
而argv是一个指向指针的指针,为什么不是指针数组呢?因为前面讲过,函数原型中的[]表
示指针而不表示数组,等价于char **argv。那为什么要写成char *argv[]而不写成char
**argv呢?
这样写给读代码的人提供了有用信息, argv不是指向单个指针,而是指向一个指针数组
的首元素。数组中每个元素都是char *指针,指向一个命令行参数字符串。 -
eg
解释说明: -
注意程序名也算一个命令行参数,所以执行./a.out a b c这个命令时, argc是4, argv如下图所示:
七、指向数组的指针与多维数组
八、函数指针和函数指针类型
九、不完全类型和复杂声明
这篇关于(第23章)LinuxC本质中指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!