C语言指针-1

1 概述-指针的出现解决了什么问题

关于这个问题很多文章感觉也没有说清楚,我更是不知从何说起。
最大的感受就是可以间接寻址,摆脱实参和形参数据拷贝问题。

2 变量地址和地址的存储

2.1 取地址运算符-&

&运算符的作用就是取得变量在计算机内存中的地址,示例代码如下。

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>
#include<string.h>

int main()
{
	// 获得一个变量的地址
	int a = 0;
	printf("%p\n", &a); //打印地址使用%p
	return 0;
}

2.2 变量地址的存储and解引用

1 变量的地址用对应类型的指针变量存储(类型不对应在解引用时会出错)
2 解引用-得到指针变量存储的地址下存储的值
在这里插入图片描述

int main() {
	int a = 1010;
	int* p = &a;
	printf("%d\n", *p);  // 输出 1010
}

2.3 指针变量的大小

#include <stdio.h>
//指针变量的⼤⼩取决于地址的⼤⼩
//32位平台下地址是32个bit位(即4个字节)
//64位平台下地址是64个bit位(即8个字节)
int main()
{
	 printf("%zd\n", sizeof(char *));
	 printf("%zd\n", sizeof(short *));
	 printf("%zd\n", sizeof(int *));
	 printf("%zd\n", sizeof(double *));
	 return 0;
}

2.4 指针变量±整数

结论:指针的类型决定指针前进或后退一步的长度

int main()
{
	int n = 1010;
	char* pc = (char*)&n;
	int* pi = &n;

	printf("%p\n", &n);    // 000000A5BE4FF974
	printf("%p\n", pc);    // 000000A5BE4FF974
	printf("%p\n", pc + 1);// 000000A5BE4FF975 
	printf("%p\n", pi);    // 000000A5BE4FF974
	printf("%p\n", pi + 1);// 000000A5BE4FF978

	return 0;
}

3 const修饰

1 被const修饰的变量初始化后不能被修改

int main() {
	int m = 0;
	m = 20;
	const int a = 10;
	//a = 1; //报错,a的值不能被修改
	return 0;
}

可我就是想修改a的值怎么办呢?我们看一下下面的代码

int main() {
	int m = 0;
	m = 20;
	const int a = 10;
	int* p = &a;
	*p = 20;
	printf("a = %d\n", a); // a = 20
	return 0;
}

从程序的输出我们可以看到,a的值变成了20,成功地改变了a的值。当然,如果const修饰的变量可以通过这种方式更改的话,程序的安全性就会大打折扣。所以我们需要让a的值无法通过指针的方式更改,也就是说,即使让一个指针拿到了a的地址,也无法改变a的地址。(下次接着写吧,困了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值