指针的一些见解

指针介绍

在C、C++,最牛皮也是最令人头疼的就是指针了,记得那时是一个炎热的下午,老师吐出了那两个让我毕生难忘的字:指针(然后太热了睡着了)。还记得当时,老师就提醒我们指针是C强大的重要部分,但同时如果处理不好,问题也很大。

但其实吧,学习指针的压力也不是那么大的。(自行补图)

typeName * pointName;
如int * a;
a存储的是一个地址,而* a则存储一个int型的变量
重要的是a存储的地址,而不是 *a的内容,因为地址确定的内容也是确定的。
所以,下列代码是有问题的:

int *a;
a = 233;

这里的a存储啥地址?不知道。
不知道指针指向哪里就是风险!,所以指针在创建的时候要初始化一下。
如果创建指针之后没有初始化目标,就初始化为NULL;NULL可以理解为0地址,但又有所不同。

还有一个令人迷惑的行为,int *a=NULL;前面说了 *a应当是一个int型,但为什么赋值为一个地址?
其实这个过程是给a赋值的过程,而不是给 *a这个整体。

指针和数组

开始了,开始了,C的一个难点。
int a[10]={0,1,2,3,4,5,6,7,8,9};
int * p=a;//众所周知,a不但是数组名同时也是a【0】的地址
所以输出a【0】的方式:直接a【0】或者 * p;
如果是输出a【1】,方法也有很多:

a[1]*++p)、*(p+1)、p[1]

没错,p可以直接当成数组名使用,不论是主函数还是其他函数内。
这里面的p+1要提一下,是加一之后解引用(就是加星号的标准说法),所以加一对应的是地址加一个,
是加一个int地址的长度,所以到达了a[1]的坐标,才会输出a[1]的。

指针和字符串

这里的字符串是指char数组,而不是C++的string类。

char color[10]="blue";
printf("My lucky color is %s",color);

正常应该是输出blue。
看起来寻常不过,但是之前提过color是color[0]的地址,但是他直接就输出了整个字符串。
所以下面的代码也是成立的。

char *p="name";//这里的name是这个字符串的地址

这里的主角就换成了字符串了,char数组和之前提过的数组还是有所不同的:
字符串常量代表地址;
指向字符串的char指针可以输出整个字符串(一直到’\0’)

按上面的来,那么(int *)p应该是什么? 是name这个字符串的地址

指针和结构体

struct link
{
	int data;
	struct link* next;
}

没错,还是链表。
struct link head如果想调用data,需要的是成员运算符 ‘.’
但是如果是一个指针struct link* head,他的data成员应该是(*head).data//加括号是因为优先级的原因。
很麻烦,所以出现了箭头运算符head->data。

说到链表不得不提的问题就是在插入删除时如果控制不好,会造成断链,就是前一个指针不知道指向哪里或者是指向一个被释放的空间、甚至是head没有初始化,这些都很危险!
而边界条件这些更是新手学习链表的大坑。

总之指针的建议就是要多练习,听懂和能用还是差了很多,犯错什么的都很正常。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值