第一个层次
指针的基本使用
#define _CAT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main(void) {
//第一个层次:指针的基本使用
int area = 257;
char* p;
p = (char*)&area;
printf("%d\n", *p);
system("pause");
return EXIT_SUCCESS;
}
结果是:1
为什么这个area存储的是1100呢?
因为257的二进制是1 0000 0001,又因为一个字节占8个二进制位,所以1是一个字节,后面的0000 0001又是一个字节,所以前面是1 1 ,后面没有了就都是0, 1 1 0 0
为什么结果是1呢?
因为int是四字节的,而我们用的char是一字节的去取它,当然只能取出第一个。
比喻:本来是一头牛,你拿着一头羊的大小去取它,肯定尺寸不够啊,那你只能取到牛身上的肉(和羊一样大小)的部分。
现在我们把char改成long long类型,long long类型占8个字节,而age只有四个字节,就会把隔壁老王取出来。
#define _CAT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
int main(void) {
//第一个层次:指针的基本使用
int age = 40;
long long * p;
p = (long long *)&age;
printf("%ld\n", *p);
system("pause");
return EXIT_SUCCESS;
}
为什么还是40,不是把隔壁老王取出来了吗?
因为老王不在家,他那座房子是空的。
这里多放了一个tmp,用p1查看了下它的地址是:0x006FF858
p2的地址是:0x006FF84C ,第一个是28,28正好是40
他们之间的地址相差很大,所以他们之间很安全
vs编译器有点奇怪,周围都是0,换成gcc编译器就有可能排在一起了
第二个层次
指向数组的指针
第一种打法:好理解
#include<stdio.h>
#include<Windows.h>
int main(void) {
//第二层次:指向数组的指针
int enemy[10] = { 10,20,50,45,54,12,87,45,54,64 };
//定义了一个指针,指针名叫yewen
//yewen可以指向一个数组(含有10个int类型的数据)
int(* yewen)[10];
//yewen指向了数组enemy
yewen = &enemy;
for (int i = 0; i < 10; i++) {
printf("打:%d\n", (*yewen)[i]);
}
system("pause");
return 0;
}
第二种打法:就是第0个数组,然后分别输出
#include<stdio.h>
#include<Windows.h>
int main(void) {
//第二层次:指向数组的指针
int enemy[10] = { 10,20,50,45,54,12,87,45,54,64 };
//定义了一个指针,指针名叫yewen
//yewen可以指向一个数组(含有10个int类型的数据)
int(* yewen)[10];
//yewen指向了数组enemy
yewen = &enemy;
//第一种打法
/*for (int i = 0; i < 10; i++) {
printf("打:%d\n", (*yewen)[i]);
}*/
//第二种打法
for (int i = 0; i < 10; i++) {
printf("打:%d\n", yewen[0][i]);
//yewen[0]:表示指向的第0个数组
//yewen[1]:表示指向的第1个数组
}
system("pause");
return 0;
}