看了一些指针的博客资料,也没有弄懂,大概要多敲几次才会明白吧。
下面是我自己对指针的理解(代码没运行过)
小明要帮多个同学拿鞋子,如果一个个打开鞋柜确认,太耗时间。于是小明向同学索要鞋箱的号码,同学给了他纸条,纸条就是指针。
鞋箱可以是连续的,也可以是非连续的,有纸条,小明寻找鞋子的速度就快。(引用)
*p=&shoe
纸条箱子就是指针数组,指向纸条柜子的纸条就是二重指针
**pp=*p
假如两个同学的鞋子要交换鞋子,不用考虑其他的情况下,可以互换纸条,节省了拿鞋子,换鞋子的功夫。(交换)
*p1=&shoe1
*p2=&shoe2
*temp=*p1
*p1=*p2
*p2=*temp
_______________________________________________________________________:
基础知识:
1.指针的地址是四个字节,无论指向char,float还是struct都是四个字节。
2.指针未指向时,它地址的值是随机的(野指针),最好让它指向一个NULL,也就是地址0,制作空指针。
3.取地址,&是取地址符,但有些情况可以不用&,比如数组名其实就是数组第一个元素的地址,函数名就是这个函数的地址。(%p出来的非真正意义上的物理地址,而是虚拟地址)
4.解地址(解应用),从指针指向的内存块里读取内存数据,对一个指针解地址就是在它前面加一个*号,编译器通过指针的类型,来判断一次应该取多少字节,如果是char,一次取一个字节,如果是int,一次取四个字节。
5.c语言规定,指针相减自动除以sizeof(指针类型)
6.不能对void指针进行解地址,要先进行强制转化
下面是代码部分(能run)
因为太多printf就把它变成P了
#include#define P printf
如果指向的是整形变量
/指向整形变量
int shoe=11;
int* p;
p = &shoe;//&shoe就是shoe的地址
P("%dn", *p); // 11,p指向的变量
P("%dn", p); // 指针本身的地址,随机。
要注意*p才是p指针指向的变量,输出p是输出p指针的地址
直接用p=shoe是不被运行的,p需要的是一个地址,得用&shoe
指向数组,代码如下
//指向数组
int sc[2]{0,1};
int *p2;
p2 = sc;
P("%dn",*p2); // 0,a[0]
p2 = &sc[0];
P("%dn", *p2);// 0
数组名sc也是一个地址,是数组第一个元素的地址。与sc[0]输出结果相同,但两者又有本质的不同,指向sc是指向整个数组,指向sc[0]是指向一个元素
指针与数组的关系
//指针与数组
int v;
v = sc[1];
P("%dn", v);
v = *(sc + 1);
P("%dn", v); //都等于1,sc[1]与*(sc+1)结果相同。数组名本身也是一个指针
p2 = sc;
P("%dn", * (p2 + 1));//用*(p2+1)访问数组第二个元素
然后是指针本身的运算
int* p3 = &sc[1];
P("%dn",p2); //3865696
p2++; //加上一个p2所指类型字节大小的地址,int即4字节
P("%dn",p2);//3865700差4,一个int字节
P("%dn", *p2); //1 ,a[1]
p2--;
P("%dn", *p3 - *p2);//1,也就是a[2]-a[1],指针不能相加
注意指针不能相加,会指向未知的地址。
指向结构体
struct shoeshop
{
int shoe1;
int shoe2;
int shoe3;
};
struct shoeshop a ={10,20,30};
struct shoeshop* p4;
p4 = &a;
p4->shoe1;
p4->shoe2;
p4->shoe3;
但是我想分别打印shoe1,shoe2,shoe3的值时却出了问题,不知道为什么



