linux c总结 指针的理解

指针、指针类型、指针指向的类型
指针,也是一种变量类型,存放的数值是一个地址,指针指向的就是这个地址中存放的信息。虽然可以打印出来数值,但和普通整型数值的属性是不同的。
指针有指针的类型和指针所指向的类型的区别,只有同类型指针量的值才能进行操作。如

int *p 、 int **q 、 int a[5][5]

p是一个一级指针,q是二级指针。
对与数组,a是一个二级地址,a[0]是一个一级地址,不能因为p和q都是指针就随便把a的地址给了p,或者把a[0]的地址给了q。这样做编译器会提示数据类型不同,提醒使用强转。
虽然p和q都是指针指针,但从定义的角度看他们的类型是不同的。

举个例子:
int pstr=(int)&ss;//声明了一个指向结构对象ss的指针。但是它的类型和它指向的类型和ptr是不同的。
ss是结构体类型,取了地址就是结构体类型指针,而pstr是整形指针,类型不同,要用强转。

对于指针类型的判断,将定义的指针变量名去掉,剩下的就是表示这个指针的类型。
对于指针指向的类型的判断,将定义的指针变量名和它左边的“*”号去掉,剩下的就是它指向的类型

int *ptr; //指针所指向的类型是int  
char *ptr; //指针所指向的的类型是char  
int **ptr; //指针所指向的的类型是 int *  
int (*ptr)[3]; //指针所指向的的类型是 int()[3]  
int *(*ptr)[4]; //指针所指向的的类型是 int *()[4]  

指针和数组

数组,在定义一个数组时就已经给它分配了内存。我们区别不同的数组主要是通过数组名的不同看出来,我再深入理解一点就是数组名的不同是因为内存地址的不同,而数组名就像门牌号一样标志不同的数组属于不同的内存区。这样来看数组和指针就有不少共同点,更细一点我觉得数组名和指针就是同一个东西。

数组中有一维数组、二维数组。。

  • 对于一维数组, 数组名是在数组定义时就被赋予了给该数组划分的内存区域的首地址,因为数组是顺序表,后面的元素只要沿着首地址往后就能找到自己对应的数值。
  • 对于二维数组。其实我觉得本质和一维数组是一样的,用一个for循环,从首地址挨个往后输出一样可以把所有元素得到。我觉得二维数组是为了在人们解决问题时和人的思维方式更接近,更方便而产生的。若要对当中的元素需要分成一段一段的,从一行的角度看过去,很不方便。划分为行列后,就很形象。
    刚开始学习数组和指针之间的关系时有点晕。举个例子二维数组a[5][5],
    a,a[0],的地址都是同一个地址值,都表示数组首地址,但是地址的意义不同,&a是整个数组的地址,是从整个数组的角度看转到指针的概念就是一个三级指针;a是第0行的地址,是从单个行的角度来看,转到指针概念可以理解为是一个行指针,是二级指针;a[0]是首行第0元素的地址,是一个一级指针;而a[0][0]就是第0个元素的值。
    这里关于各种首地址,就二维数组来理解的。我觉得还可以从字符串的角度来想。例如一个要在数组中存放一些字符串,我们可以选择定义一个指针数组,数组元素为指针,字符串从代码角度看只有指针存进了数组,但从内存中看这些字符串已经都存进去了。
    指针只是这些字符串的首地址通过找到各自的首地址来输出字符串。不过也可以用这个例子来理解数组和指针。每一个字符串放在一个行数组里,字符串首地址就是这个行数组的第一个元素的地址,给一个指针就指向字符串首地址存放的就能输出后续信息,和数组行指针的功能一致。

关于数组指针和指针数组
指针数组:定义是:char *a[10]
*就是数组里面的元素都是指针,用来表示二维数组时就和我上面说的有点重复,里面的元素表示每一行的首元素的地址,后续元素只要沿着首地址往后加就能得到
数组指针:定义是:char (*a)[10]
从名字可以看出这是一个指针,指向一个数组。从我最开始提的判断方法看,去掉变量名和左边的星号,就是指针指向的类型,是()[10],指向一个十个元素的一维数组。相当于是定义了一个行指针,与上面的区别,那是定义了一群行指针。

参考:指针理解,很经典

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值