理解第一篇
上完大学不是我吹(仅仅说我认识的本学校本专业)估计很明白指针的人绝对不超过百分之50,学校low不low另说(因为问他们讲得断断续续的自己也说不明白,只知道那样可以用) 学链表树形结构.......等结构的时候一直困扰一个问题 例如int* a 和int *a ,*a,**a,int**a 或者说*******a 或者说Node n 和Node *n到底什么意思?大家都知道这是指针 ,指针本质是什么都说是地址.每次编程的时候都是报错了才能发现指针错误再去改正其实就是不太理解
例子 1
void Functionc() { int** a= (int** )5; printf("%d\n" ,a); } //结果 a仍然是5
对应汇编指令 可以看到只是把5存到堆栈
00410A56 rep stos dword ptr [edi]
26: int** a= (int** )5;
00410A58 mov dword ptr [ebp-4],5
27: printf("%d\n" ,a);
00410A5F mov eax,dword ptr [ebp-4]
解: 不光是两个** 就算写成一万个星 打印结果仍然是5 因为不管是什么类型的或者你定义的结构体后面加*或者说加** 都相当于一个新的类型
例二 & 和 * 的联系
假如你定义一个char a=10 假如你 &a 可以取到变量a的地址,你可以用char b=*a接收吗?不可以 !因为 &a 相当于 char* 类型的
那么假如char* b=&a 那么&b 是什么类型的? 对他是char** 类型的 每次加一个取地址符号就相当于类型后加个*
&取地址符条件 常量无法使用其他貌似都可以
例三
int* a 和int *a 没有任何区别!!我们好多书上写第二种 其实第一种看的比较清楚 第二种代码比较好看
例如 int* x 其中x 和*x 区别 x 是int* 类型的,*x是 int 类型的 同理 int** y y是int**类型的 *y 是int*类型的 **y是int 类型的
前面可以用*x的条件 他的类型必须是个指针类型意思就是带一个或多个*
从汇编角度理解*p的意思如图
把10赋值给了堆栈 x值存储到【ebp-4】的地址 然而px把 ebp-4的值存到了【ebp-8】 相当于把 指向x的指针(地址)存到了【ebp-8】,
下面的int x1 =*px 把指向x的指针(地址)取出来放到ecx 又把指针指向的值(10)放到了 edx ,又把edx 放到了 【ebp-c】所在内存地址
一个用指针找数组问题
int arr[5]={1,2,3,4}; int* px=arr; for(int i=0;i<=3;i++) { printf("%d\n" ,*(px++)); }
都知道能打印出来1 2 3 4 都知道指针后移动一个本质是这样的
首先了解这段代码
functionss() { int* a; a=(int*)100; printf("%d\n" ,a++); }
你以为输出101吗其实输出 104 ,那如果是char 类型输出多少 是101 short 呢?102
如果是一个* 就相当于加上那个类型(意思是相当于砍掉一个*所占字节数 如果是int** 的一个变量相加要看int* 所占字节)所占用字节数 (+1的情况 如果加2 的话就是 2*所占字节数)
【int** short** 所有** 所占的都是四字节】 这个说的不大明白.......不理解也没事
进入正题
int arr[5]={1,2,3,4}; int* px=arr; for(int i=0;i<=3;i++) { printf("%d\n" ,*(px++)); }
为什么 px++ 能准确找到下一个数组值村的数呢? 数组里面的值是连续存放的大家都知道 ..... px 为int* 类型 这里px++加的时候相当于 加上4 内存里加上四刚好是下一个数的地址 *px 相当于取出px地址里面的值显示出来
未完待续....
原文:https://www.cnblogs.com/xuexidememeda/p/12283845.html