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语言数组指针

### 回答1: C 语言中的指针可以说是一个比较难理解的概念,因为它涉及到了计算机内存的操作。如果你不熟悉内存的工作原理,指针的概念可能会比较抽象和难以理解。 此外,指针的概念需要对数据类型、地址、内存分配等方面有一定的了解,而这些知识对于初学者来说可能是比较困难的。 同时,指针的错误使用也很容易导致程序崩溃,因此需要十分小心。 总的来说,C 语言中的指针是一个需要深入理解和练习的概念,但是它是 C 语言编程中很重要的一部分,并且对于提高编程能力有很大的帮助。 ### 回答2: C语言指针之所以被认为难学,是因为它相对于其他编程语言来说更加底层且概念较为抽象。以下是几个可能的原因: 1. 指针与内存管理:C语言中,指针与内存密切相关。指针可以直接访问内存地址,但也需要手动进行内存的分配和释放,否则可能会导致内存泄漏或者悬空指针等问题。 2. 指针算术:C语言允许对指针进行算术操作,如指针加减、指针递增、递减等。这要求学习者掌握指针和内存地址之间的关系,并且需谨慎处理指针算术,以确保不发生内存越界等错误。 3. 多级指针:C语言支持多级指针,允许指针指向指针。这增加了学习的难度,尤其是对于初学者来说,理解多级指针的概念和应用可能会比较困难。 4. 字符串处理:在C语言中,字符串是以字符数组的形式存储和处理的。使用指针可以更有效地操作字符串,然而对于初学者来说,指针与字符串的关系可能需要花费更多的时间去理解和掌握。 虽然C语言指针难度较高,但掌握好指针的概念和使用方法对于理解底层编程、内存管理以及某些高级语言的底层原理都具有重要意义。通过坚持学习、阅读指针相关的资料和教程,并进行实践,可以逐渐掌握好C语言指针。 ### 回答3: C语言中的指针是许多初学者感到困惑的一个概念,因为它与其他高级语言的概念不同且较为抽象。以下是指针难以学习的几个原因: 第一,指针是一种直接访问内存地址的方式。这意味着我们需要理解计算机内存的工作原理,并学会如何在程序中正确地使用这些内存地址。这对于没有计算机底层知识的人来说可能会很复杂。 第二,指针有许多复杂的语法规则。例如,我们需要使用星号(*)来声明指针变量,并使用地址运算符(&)来获取变量的地址。此外,我们还需要理解指针的类型匹配规则以及指针算术运算的规则。这些规则对于初学者来说可能会很令人困惑。 第三,指针容易出现错误。由于指针直接访问内存地址,因此在使用指针时出现错误可能导致程序崩溃或产生未定义的行为。例如,当指针没有正确初始化或者指针指向的内存已被释放时,我们可能会遇到段错误或野指针等问题。 第四,指针的概念相对抽象。指针是一种间接引用的方式,通过指针我们可以访问其他变量的值或者修改其他变量的值。这种间接性可能会增加学习的难度,尤其是对于没有编程经验的人来说。 总之,C语言指针之所以难以学习,是因为它需要理解底层的内存访问机制、掌握复杂的语法规则、注意错误的出现以及理解抽象的概念。然而,一旦掌握了指针的概念和用法,它可以成为编写高效、灵活的程序的重要工具。因此,努力学习和理解指针是编程学习的关键。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值