浅谈对指针的理解

一级指针

一级指针就是初识指针时的所知道的指针,编译器会给他分配四个字节的大小,它的里面存储着一个地址。值得注意的是,当一个指针变量被定义后,不管往这个变量中存储任何值,他都会认为这是一个地址,并以地址的方式对他解读,

一级指针的定义

例如:

int main()
{
char a;
char* pa=&a;
int b;
int* pb=&b;
char* pstr="i love u";
}

其中,pa,pb,pstr都是指针变量,可以发现,只需在它所要指向的数据类型后加*就变成相应类型指针的定义。

一级指针的使用

例如:

int mian()
{
int a=0;
int* pa=&a;
*pa=10;
}

这时候就要用上这个解引用运算符,他将指向pa中的地址的位置,可以理解,这里的pa与a是等价的。

二级指针

对指针理解的方法介绍

二级指针是存储指针地址的指针,一般大家看到这里有时候就会混乱,这里我介绍一下我的方法:
1.了解指针的类型:例如

int main()
{
int a=0;
int* pa=&a;
int** ppa=&pa;
int*** pppa=&ppa;
}

这里我想问你,pppa的类型是什么?
没错 它的类型我想聪明的你已经知道了(心里想,这么简单的问题怎么难的住我)
pppa的类型是 int***。
看指针的类型时,只需要把它的名字去掉,剩下的就是它的类型。知道指针的类型我们就要知道指针指向的类型了
2.了解指针指向的数据类型:
问题又来了,pppa指向什么类型的数据?
这肯定也难不倒聪明的你啦
pppa指向的数据类型时 int**。
看指针所指向的类型时,只需要把他的名字和属于它的前面的*去掉就是它所指向的数据类型。
如果理解了上面两个知识点,那么二级指针也就很好理解了

二级指针定义

例如:

int main()
{
int a=0;
int* pa=&a;
int** ppa=&pa;
}

其中ppa就是二级指针,他指向类型为int*的指针pa,因此给他赋值时用&pa;

二级指针的使用

二级指针一般用于传参数的时候,比如要传一个指针数组(后面会说)的时候,或者对指针的地址进行改变
例如:

int main()
{
char arr[5]={1,2,3,4,5};
char* parr=arr;
char** pparr=&parr;
**pparr=6;//将数组第一个元素变为6
*(*pparr+1)=7;//将数组第二个元素变为7
}

指针和数组

写在开头的话:指针就是指针,数组就是数组,他们不一样!
为什么很多人会混淆这两个东西,是因为他们有一些共用的东西。

指针

编译器会为指针变量分配四个字节,这四个字节存储着某个数据的首地址,对任何放入指针变量的数据都会被当作地址来处理

数组

例如 int a[5],编译器就会为其分配大小为sizeof(int)*5字节的空间,数组中存放若干个是同一种类型的元素,数组中不能存放函数。
值得注意的是数组名,
a:表示数组首元素的首地址
&a:表示数组的首地址
这两个的值是一样的,但是意义却不同 例如

main()
 { 
 inta[5]={1,2,3,4,5}; 
 int*ptr=(int*)(&a+1); 
 printf("%d,%d",*(a+1),*(ptr-1)); 
 }

会输出 2 和5
原因是,a的类型是char* ,&a的类型是char(*)[5](这是数组指针后面会说)因此两者加1的结果也不相同,需要你自己慢慢理解

指针数组和数组指针

理解这两个东西很容易,后缀名字是什么,他的本质就是什么
首先思考这三个是什么

int(*p)[5];
int*p[5];

指针数组

指针数组通过后缀名就可知道是数组,这个数组中存储的是指针。

指针数组的定义

指针数组就是上个代码块中的int*p[5]
其中数组名是p,数组长度为5,数组元素类型是int *。

数组指针

数组指针通过后缀名就可知道是指针,这个指针指向的数据类型是数组。

数组指针的定义

int(*p)[5];

为什么和数组指针的定义看起来那么相像呢?答案在于运算符的优先级,其中[]的优先级比*高,但是()的优先级是最高的,因此可以这么理解,在指针数组中,p先与[]结合,即p已经成为了数组了,剩下的就是数组元素的类型了。在数组指针中,p先和*结合,说明它是一个指针了,剩下的就是指针指向的数据类型了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值