自学指针遇到的问题记录

指针要素:

1.指针变量类型      一般为变量类型*,特制指针变量。

2.指针变量长度      指针变量是存储地址的  ,故长度为地址位数。

3.指向哪                  指针变量存储的地址值,即指针变量的值

4.指向的变量参数(类型,长度)


*取指针指向的变量。

&取变量占用的内存地址,一般可赋值给指针变量。

需要注意的是指针运算符*和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中,‘*’是类型说明符,表示其后的变量是指针类型。而表达式中出现的‘*’则是一个运算符用以表示指针变量所指的变量

因为在申明时*为类型说明符,所以此时赋值给指针变量的值为地址,而不是变量值。

如int c=1;int *p=c;是错误的,而应该是int *p=&c;

又或c是一个数组名,int *p[]={a,a+1,a+2,a+3};a为数组名,可看做一个指针变量,a+1为指向a[1]的指针变量,其他同理。


剖析*号符:

在声明指针时,*起说明符作用,而不是取指向变量

1.char *p --> (char *)p -->p是一个char *类型变量//或者*p为char类型,即要素4。

故char *类型变量为指向char变量的指针

2.char **p -->(char *)*p -->*p是一个char *类型变量即char类型指针变量--》p为指向char 类型指针变量的指针变量(为char **)类型变量。

故char **类型变量为指向一个char *类型指针变量的指针,即指向指针的指针。

3.char *p[]-->(char *)p[]-->p[]是一个数组,且数组每个元素都是char *类型变量(具体看1)。

4.char **p[]-->(char *)*p[]-->(char **)p[]-->p[]是一个数组,且每个元素都是char **类型(具体看2)

5.char (*p)[]-->(*p)[]为一个char数组,而(*p)是char数组首地址-->p为指向char数组首地址的变量。即指向地址(此地址不是指针变量)的指针变量。

解决指针问题最好用画图法,把结构对应画出来。



我认为最需要搞清楚的是第3个,指向哪

犯的错误如下:

(1)char *p=‘a';

(2)char *p;*p='a';

(3)char *p,c;c='a';*p=c;

此时,只是定义了一个char *类型的指针变量,第3要素一般为null,不知道指向哪。可以理解为没有分配内存空间。

此时给他赋值,会出现错误。

第三种特别注意,*为取指针变量所指向的变量,此时还没有指向变量,故不可这样赋值,而用p=&c;将变量地址赋给指针变量。

需要注意的是,当用指针来操作字符串时,可以直接赋值,如char *p=”I love“;或char *p;p=”i love“;

因为”i love“可看做一个地址,指向此常量的首地址。


数组名可当做一个指针变量(指向数组首地址的指针变量)。


printf中的使用%s与%c

printf("%s",p);

printf("%c",*p);

用%s时使用首地址,即指针。使用%c时使用此指向变量(用*取指向变量)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值