c语言指针一点都不难

目录

指针

指针数组与数组指针

指针数组

数组指针


指针

如果说结构体是C语言的肚子可以用来存放东西,那么指针就是C语言的神经纤维用来指向。

char *p;  定义了一个指向char类型变量的指针p,但是没有让它指向任何地址,可以称之为野指针。

 char *p=&a;   让p指向变量a的地址,&表示取地址的意思,&a即取a的地址。当指针p指向变量a的地址,我们就可以通过对指针p的操作,来实现对变量a的操作。

*p的*表示解引用,即取出变量p中的地址表示的值。需要注意的是:char *p中的char是规定指针p指向的类型。如果是int *p,那么指向的是int类型的指针,才能打印我们希望的值。

 

指针数组与数组指针

初学C语言的时候,对指针数组是很陌生的,当时我学的时候就是数组勉强理解,到指针就已经晕了。经过不断的接触,慢慢的发现其实它们并不神秘,只要我们了解了它们的构造和概念,就可以在随后的编程中,逐步掌握了,现在,我们先来剖析一下二者。

char (*p)[2]和char *p[2]    这两个哪个是指针数组?    可以通过一个方法来区别,即表达式有没有括号()。

char *p[2]是没有括号的,所以我们就可以直接判断,它是一个指针数组。指针数组强调的是数组,所以不会对*p加上括号。

char (*p)[2] 是数组指针,*p是用括号括起来的,所以数组指针强调的是指针

好了,现在我们就可以很快的区别谁是数组指针,谁是指针数组了。

 

指针数组

类型 *变量名[数组长度];

顾名思义,指针数组,即存放指针的数组,数组的成员是指针 ,因为如果我们需要使用到多个指针,每次都定义一个新的指针,将会比较繁琐,所以指针数组,孕育而生。其实说白了,指针数组就是数组中存放了几个地址连续的指针。

比如,int *p[2];    我们定义了一个指向int类型的指针数组,再定义int a=100;    int b=200;  

然后将a和b的地址分别存放在变量p[0]和p[1]中,p[0]=&a;    p[1]=&b;    

打印一下,printf("p[0]=%d,p[1]=%d\n",*p[0],*p[1]);    输出p[0]=100,p[1]=200;    

这个简单的例子说明了指针数组的确是存放指针的数组。

char *pa;
int *pb;
printf("sizeof pa is =%d\n",sizeof(pa));    //打印4
printf("sizeof pb is =%d\n",sizeof(pb));    //打印4
printf("sizeof *pa is =%d\n",sizeof(*pa));    //打印1
printf("sizeof *pb is =%d\n",sizeof(*pb));    //打印4

记得我之前笔试的时候,经常会有上述 关于指针所占字节大小的填空题。

数组指针

类型(*变量名)[数组长度];

介绍了指针数组,现在我们来看看数组指针。数组指针,是指向数组的指针。比如char (*p)[5];    该指针p指向具有5个char类型成员的数组空间。

一般使用的指针,如char a[10]="hello";   char * p=a; 表示该指针指向数组a,其实是指向了数组首元素a[0]的地址。这就是区别所在。来看下面一段代码。

char msg[2][3]={1,2,3,4,5,6};
char buf[2][3];
memset(buf,0,sizeof(buf));

char (*Pc)[3]=buf; //数组指针
char (*Pd)[3]=msg; 
int i=0;
for(i;i<6;i++)
{
printf("msg is =%d,",*(*Pd+i));

}

printf("\n");                //换行
scanf("%s",*(Pc));     //输入
printf("buf is %s\n",*buf);

乍一看,是不是觉得有点凌乱,我们慢慢来剖析这段代码。首先我们定义了msg和buf两个二维数组,并且初始化msg。

然后定义了两个数组指针,Pc和Pd。先来看Pd,我们让Pd指向数组msg,然后就可以通过操作Pd来实现对数组msg的操作。

我们用一个for循环来打印出msg中所有的元素。重点是*(*Pd+i)  ,*p的意思是取出变量p中地址里的值,我们可以把*(*Pd+i)看成是*p,即*Pd+i=p,这就很好理解了。*Pd指向msg,所以*Pd存放的是msg[0][0]的地址,*Pd+1存放的是msg[0][1]的地址,依次类推,这就是为什么*Pd要加i。所以*(*Pd+i)   打印出了msg所有的元素。为了验证上述说法,我们来打印一下*Pd的地址。

printf("p of *Pd is=%p\n",*Pd);
printf("p of msg[0][0] is=%p\n",msg[0]);

printf("p of *Pd+1 is=%p\n",*Pd+1);

printf("p of msg[0]+1 is=%p\n",msg[0]+1);

编译发现,*pd和msg[0]的地址一样,*pd+1和msg[0]+1的地址也一样。

没错,*pd存放的是地址,它指向了msg的地址。

下一篇 C语言数组指针

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值