C++指针三重境界

第一个层次

指针的基本使用

#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;
}

第三个层次

函数指针

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值