今天刚好看汇编需要,就学了学。
本篇文章会不断完善,有疑问,请在评论区留言
1.表示乘法,例如int a = 3, b = 5, c; c = a * b;,这是最容易理解的。
2.表示定义一个指针变量,以和普通变量区分开,例如int a = 100; int *p = &a;。
3.表示获取指针指向的数据,是一种间接操作,例如int a, b, *p = &a; *p = 100; b = *p;。
4.取指针指向的数据。例如: printf(" 内存地址 %p\n", *(p));
,printf("当前地址指向的值 %d\n", *(*(p)));
假设有一个 int 类型的变量 a,pa 是指向它的指针,那么*&a和&*pa分别是什么意思呢?
&a可以理解为(&a),&a表示取变量 a 的地址(等价于 pa),*(&a)表示取这个地址上的数据(等价于 pa),绕来绕去,又回到了原点,&a仍然等价于 a。
&*pa可以理解为&(*pa),*pa表示取得 pa 指向的数据(等价于 a),&(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa。
***p3等价于*(*(*p3))
如果一个指针指向的是另外一个指针,我们就称它为二级指针,或者指向指针的指针。
int a =100;
int *p1 = &a;
int **p2 = &p1;
#include
int main(){
int a =100;
int *p1 = &a;
int **p2 = &p1;
int ***p3 = &p2;
printf("%d, %d, %d, %d\n", a, *p1, **p2, ***p3);
printf("&p2 = %#X, p3 = %#X\n", &p2, p3);
printf("&p1 = %#X, p2 = %#X, *p3 = %#X\n", &p1, p2, *p3);
printf(" &a = %#X, p1 = %#X, *p2 = %#X, **p3 = %#X\n", &a, p1, *p2, **p3);
return 0;
}
int (*p)[4] = a;
括号中的*表明 p 是一个指针,它指向一个数组,数组的类型为int [4],这正是 a 所包含的每个一维数组的类型。
用来学习 *(p+1)和 *(p)+1 的区别
#include "stdafx.h"
#include "windows.h"
#include "tlhelp32.h"
#include
#include "WinDef.h"
int main(){
int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };
int (*p)[4] = a;
printf(" 取二维数组的第一行的内存地址 %p\n", *(p));
printf(" 取二维数组的第一行的第一个元素 %d\n", *(*(p)+0));
printf("取二维数组的第一行的第二个元素 %d\n", *(*(p)+1));
printf(" 取二维数组的第二行的内存地址 %p\n", *(p+1));
printf(" 取二维数组的第二行的第一个元素 %d\n", *(*(p+1)+0));
printf("取二维数组的第二行的第二个元素 %d\n", *(*(p+1)+1));
return 0;
}
*(p+1)+1
表示第 1 行第 1 个元素的地址。如何理解呢?
*(p+1)
单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;就像一维数组的名字,在定义时或者和 sizeof、& 一起使用时才表示整个数组,出现在表达式中就会被转换为指向数组第 0 个元素的指针。
*(*(p+1)+1)
表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。
根据上面的结论,可以很容易推出以下的等价关系:
a+i == p+i
a[i] == p[i] == *(a+i) == *(p+i)
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == ((a+i)+j) == ((p+i)+j)
#include "stdafx.h"
#include "windows.h"
#include "tlhelp32.h"
#include
#include "WinDef.h"
int main(){
struct{
char *name; //姓名
int num; //学号
int age; //年龄
char group; //所在小组
float score; //成绩
} stu1;
//给结构体成员赋值
stu1.name = "Tom";
stu1.num = 12;
stu1.age = 18;
stu1.group = 'A';
stu1.score = 136.5;
//读取结构体成员的值
printf("%s的学号是%d,年龄是%d,在%c组,今年的成绩是%.1f!\n", stu1.name, stu1.num, stu1.age, stu1.group, stu1.score);
return 0;