0x 00、前言
自己对视频的理解,小白一枚,如有错误,欢迎指出,感谢
0x 01、类型转换
char a;
int b;
a = 10;
b = (int)a;
上述是强制类型转换的写法,但char和int其实不需要。
结构体不行,因为结构体中定义的不知道是转哪个,但是指针可以
struct Student
{
int level;
int age;
};
void Test()
{
int x;
x = 10;
y = (Student)x;
}
0x 02、&符号的使用
&是地址符,类型是其后面的类型加一个 “*”,任何变量都可以使用&来获取地址,但不能用于常量
#include "stdafx.h"
int main()
{
char a = 10;
short b = 20;
int c = 30;
char pa = &a;
short pb = &b;
int c = &c;
//&a 是什么类型?
//&b 是什么类型?
//&c 是什么类型?
return 0;
}
这是个错误代码,错误如下,应该是char *、short *、int *
注:上篇文章说指针都要写全部的语法,但是&a等是知道了类型的,所以可以舍去,写为简写
0x 03、“带*类型” 的特征探测:求值
#include "stdafx.h"
int main()
{
int* px;
int** px2;
int*** px3;
int**** px4;
//*(px) 是什么类型?
//*(px2) 是什么类型?
//*(px3) 是什么类型?
//*(px4) 是什么类型?
int x = *(px);
int* x2 = *(px2);
int** x3 = *(px3);
int*** x4 = *(px4);
return 0;
}
成功运行,说明*(px)等的类型是其原来的类型舍去一个*,与&相反
#include "stdafx.h"
int main(int argc, char* argv[])
{
int x,y;
int* px;
int** px2;
int*** px3;
x = 10;
px = &x;
px2 = &px;
px3 = &px2;
y = *(*(*(px3)));
return 0;
}
下图是其反汇编
总结:
1、带 * 类型的变量,可以通过在其变量前加 * 来获取其指向内存中存储的值
2、在带 * 类型的变量前面加 * ,其类型是其原来的类型减去一个 *
0x 04、用指针操作数组
通过之前学习的知识来解释为什么可以这样写?
#include "stdafx.h"
int main(int argc, char* argv[])
{
char arr[10];
//char* p = &arr[0]; //取数组第一个元素的地址
//char* p2 = arr; //简写
char* p = arr;
for(int i=0;i<10;i++)
{
*(p+i) = i*2;
}
for(int k=0;k<10;k++)
{
printf("%d\n",*(p+k));
}
return 0;
}
首先,简写形式,然后第一个 * 加变量是给数组地址中的值赋值,之后再打印出数组地址中的值
总结:
1、%arr[0]代表去数组中第一个元素的地址,可以省略为数组名
2、*(p+i) = p[i]
0x05、练习
1、列出每一行的反汇编代码:
char a = 10;
short b = 20;
int c = 30;
char* pa = &a;
short* pb = &b;
int* pc = &c;
char** ppa = &pa;
short** ppb = &pb;
int** ppc = &pc;
第一部分就是先存值
第二、三部分取地址
2、列出每一行的反汇编代码:
int p = 10;
int******* p7;
int****** p6;
int***** p5;
int**** p4;
int*** p3;
int** p2;
int* p1;
p1 = &p;
p2 = &p1;
p3 = &p2;
p4 = &p3;
p5 = &p4;
p6 = &p5;
p7 = &p6;
3、被省略0.0
4、完成代码,实现数组值的互换
void Function()
{
int arr[5] = {1,2,3,4,5};
//..此处添加代码,使用指针,将数组的值倒置
//打印数组值的代码已经写完,不需要修改
for(int k=0;k<5;k++)
{
printf("%d\n",*(p+k));
}
}
答案:
还需再想想,没有完全用指针,中间有错误
#include "stdafx.h"
void Function()
{
int arr[5] = {1,2,3,4,5};
int* p = &arr[0];
int x = arr[0];
int y = arr[1];
arr[0] = (int)*(p+4);
arr[1] = (int)*(p+3);
arr[3] = (int) y;
arr[4] = (int) x;
for(int k=0;k<5;k++)
{
printf("%d\n",*(p+k));
}
}
int main(int argc, char* argv[])
{
Function();
return 0;
}