指针——钻石指针

钻石指针(作者名字起的好形象)
我们宿舍的楼下有一个酒吧,名为“钻石指针”,做为一个程序员,不得不感叹一下,指针不就像c++中的钻石一样吗?
(1)指针变量
每次有同学(尤其是学妹)让我给他讲讲指针,我常常喜欢告诉他们,不要叫指针,我喜欢称它为指针变量。
在我们定义一个指针变量的时候,有人喜欢这样写int *a; 但是我更喜欢这样写int* a; 说明指针也是一种类型,我觉的这样能更好的说明指针,
我们在学习系统结构的时候都知道,每个变量都放在内存中,每块内存都有它的地址,所以指针的作用是存放一个变量的地址,
所以我喜欢称它为指针变量,存放地址的变量 ,相对的整形变量是存放整数的变量,指针存放了某个变量的地址,所以成为指针(指向),也就可以通过
指针操纵它所指向的变量了。
int x = 1;
int* ip =&x;
*ip = 2;//x现在变成2了
cout << *ip;
cout << x;
(2)迷惑你的符号

首先要记住,在int* p;时,这里的*的意思是说明 p是一个指针变量,而且要指向int型的变量,可以把int* 合起来看,(为什么我喜欢int* a,不喜欢int *a)
而在指针的取值中*ip 表示,取值,也就是找出ip指向地址中存放的值,两个*没有关系,不要混了,*还可以当乘法呢,对应的变量有个取址运算符&,不要跟引用的声明int &c = a;搞混了,两者也没有关系。
(3)数组是指针,也不是指针
为什么说数组是指针呢,首先,先声明一个数组int a[10],我们可以通过一个指针,指向数组的首地址int* p =&a[0];之后,我们既可以通过a[5]这样的方式访问数组元素,也可以通过*(p+5)的方式访问,其实你会发现,int* p =&a[0];根本多余,我们可以直接这样int* p = a用数组名;就像是指针给指针赋值,然后他们指向了同一个地方(数组的首地址)。其实c语言在计算a[i]的值时,会对a[i]转化为*(a+i);所以你访问第五个元素时,即可以用a[4];也可以用4[a];因为转化之后*(a+4)和*(4+a)的效果是一样的。所以我说数组就是指针,
但是又不是指针,为什么呢?因为指针是一个变量(我不是说了吗?指针变量)所以赋值 p = q;自增p++都是合法的,但数组名不行,它不是变量,你可以理解为常指针。
还要注意当把数组作为函数形参时,它会退化为指针,所以int func(char* s);和int func(char s[]);等价
(4)字符串,常量还是变量
“i am aiqier”这是一个字符串常量,其实呢,它本身可以理解为一个指针,为什么这么说呢,char* p =”i am aiqier”但是这个字符串常量是放在常量区的,是只读的,
而char message[] = “i am aiqier”;这个message是数组,用每一个字符初始化数组元素,就像是这样message[] = {‘i’ , ‘ ‘ , ‘a’ , ‘m’ , ‘ ‘ , ‘a’ , ‘i’ , ‘q’ , ‘i’ , ‘e’ , ‘r’ , ‘\0′ };所以它是可读可写的,我们称之为字符串变量。
对于”i am aiqier”,你可以”i am aiqier”[4];使用它,比如打印,但是当你企图赋值时”i am aiqier”[4] = ‘c’;编译链接没问题,运行时就会有错误,比如在windows下会提示你该内存不能read.
作者 aiqier
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值