看了一些指针的博客资料,也没有弄懂,大概要多敲几次才会明白吧。
下面是我自己对指针的理解(代码没运行过)
小明要帮多个同学拿鞋子,如果一个个打开鞋柜确认,太耗时间。于是小明向同学索要鞋箱的号码,同学给了他纸条,纸条就是指针。 鞋箱可以是连续的,也可以是非连续的,有纸条,小明寻找鞋子的速度就快。(引用) *p=&shoe 纸条箱子就是指针数组,指向纸条柜子的纸条就是二重指针 **pp=*p 假如两个同学的鞋子要交换鞋子,不用考虑其他的情况下,可以互换纸条,节省了拿鞋子,换鞋子的功夫。(交换) *p1=&shoe1 *p2=&shoe2
*temp=*p1 *p1=*p2 *p2=*temp
下面是代码部分(能run)
因为太多printf就把它变成P了
#include <stdio.h>
#define P printf
如果指向的是整形变量
/指向整形变量
int shoe=11;
int* p;
p = &shoe;//&shoe就是shoe的地址
P("%d\n", *p); // 11,p指向的变量
P("%d\n", p); // 指针本身的地址,随机。
要注意*p才是p指针指向的变量,输出p应该是输出p指针自身
直接用p=shoe是不被运行的,因为p是一个指针,只能给它地址,也就是&shoe
指向数组,代码如下
//指向数组
int sc[2]{0,1};
int *p2;
p2 = sc;
P("%d\n",*p2); // 0,a[0]
p2 = &sc[0];
P("%d\n", *p2);// 0
上面说到指针只能接收地址,那么数组名sc也是一个地址,而且是数组第一个元素的地址。与sc[0]输出结果相同,但两者又有本质的不同,指向sc是指向整个数组,指向sc[0]是指向一个元素
指针与数组的关系
//指针与数组
int v;
v = sc[1];
P("%d\n", v);
v = *(sc + 1);
P("%d\n", v); //都等于1,sc[1]与*(sc+1)结果相同。数组名本身也是一个指针
p2 = sc;
P("%d\n", * (p2 + 1));//用*(p2+1)访问数组第二个元素
然后是指针本身的运算
int* p3 = &sc[1];
P("%d\n",p2); //3865696
p2++; //加上一个p2所指类型字节大小的地址,int即4字节
P("%d\n",p2);//3865700差4,一个int字节
P("%d\n", *p2); //1 ,a[1]
p2--;
P("%d\n", *p3 - *p2);//1,也就是a[2]-a[1],指针不能相加
注意指针不能相加,会指向未知的地址,没有意义。指针的加1,其实是增加一个所指向数据类型的字节,int整形的话,就是增加4个字节(指针本身也是4个字节)
|