指针1:
1,带有*的变量类型的标准写法,变量类型星号 变量名
2,任何类型都可以带 星号,带上星号以后是新的类型
3,星号可以任意多个
4,带星号类型的宽度始终是4个字节
5,赋值要转型
char:一个字节;short:两个字节;int:四个字节
局部变量,不到四个字节,都是按照四个字节分的
此时的a++,b++,c++,得出的结果都是104,而去掉一个星号时,也就是char* a,结果却是 101,102,104.是因为判断++的时候是根据自身宽度类型+的。一个星号的时候就是char short int,两个星号的时候,就是带星号类型,宽度始终为4字节。
结果是105,110,120;加上类型宽度x5
减法一样
不能乘除(编译器决定的)
结果是25(只有相同类型才能相减);结果除自身宽度
二:
&:地址符。类型是其后面加一个星号,任何变量都可以使用&来获取地址,但不能用在常量上
int
1 2 3 4
| int a; &a;得到的是a变量的地址,其类型是 int* 如:int ***x=(int***)10 int ****y=&x
|
每多一个星号就是多了四个字节
星号px(带星的)给x1的是px里面存储的值,不像&,给的是地址
①把10这个值给到了ebp-4这个地址里面(值放地址里
②把ebp-4的地址给到了eax的值里面(值的地址放值里
③eax的值给到了ebp-8的地址里(又是“值”【但这次是地址】放地址里
④ebp-8的地址给到ecx的值里(又是“值”的地址放值里
关键:⑤ecx里面地址指向的值给edx的值里(变成了值,不是地址了,edx里面是0A
⑥edx的值给ebp-0c的地址里(给了值,也就是0A
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| void main(){ char arr[5] = {1,2,3,4,5};
char* p = arr;
for(short i=0;i<5;i++) {
printf("%d\n",*(p+i));
} return 0; } *(p+i):地址的遍历,每次都是+ix1 如果换个类型 void main(){ short arr[5] = {1,2,3,4,5};
short* p = arr;
for(short i=0;i<5;i++) {
printf("%d\n",*(p+i));
} return 0; } *(p+i):是p+ix2,for循环不需要进行改变
|
三
CE:
黑的:可能在堆里,是局部变量(地址可能会发生变化)
绿的:基址,全局变量(地址不会变化)
内存中,高位低位是反着的,小端存储
内存寻址:
一个字节遍历;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| #include <stdio.h>
char data[20] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03 }; void FindBloodAddr(){ char p = data; for(int i=0;i<10;i++){ if(*(p+i) == 0x64) { printf("%x\n",*(p+i)); } } } void main(){ FindBloodAddr(); return 0; }
|
两个字节遍历:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <stdio.h>
char data[20] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03 }; void FindBloodAddr(){ short* p = (short*)data;
for(int i=0;i<10;i++){ printf("%x\n",*(p+i));
} } void main(){ FindBloodAddr(); return 0; }
|
四个字节遍历:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <stdio.h>
char data[20] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03 }; void FindBloodAddr(){ int* p = (int*)data;
for(int i=0;i<10;i++){ printf("%x\n",*(p+i));
} } void main(){ FindBloodAddr(); return 0; }
|
以自己的理解写了一个内存寻址的逐个多字节遍历:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include <stdio.h>
char data[20] = { 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09, 0x0A,0x0B,0x64,0x0C,0x0D,0x0E,0x0F,0x01,0x02,0x03 }; void FindBloodAddr(){ short* p = (short*)data; char* q = data;
for(int i=0;i<20;i++){ q = data + i; int j=0;
p = q ; if(j<5) { printf("%x\n",*(p+j)); j++; }
} } void main(){ FindBloodAddr(); return 0; }
|
四
内存分布:
这个变量(len)定义到函数里面,空间是在栈里分,如果定义到函数外面,则会在全局变量里分