C语言 ——— 指针和指针类型

目录

指针所占内存空间的大小

指针类型的意义

 指针+-整数


指针所占内存空间的大小

任意指针变量在32位平台下是4个字节:

任意指针变量在64位平台下是8个字节:


疑问:那既然指针变量的大小在32位/64位平台下都是4/8个字节,那为什么不同类型数据的地址要用不同类型的指针变量接收呢?

指针类型的意义

举例说明:

#include<stdio.h>
int main()
{
	int a = 0x11223344;
	
	int* pa = &a;

	*pa = 0;

	return 0;
}

int a = 0x11223344;

0x表示十六进制数字,一个十六进制数字代表4个bit位,那么 11223344 这么多个十六进制数字就代表8*4 = 32个bit位, 而int类型的a刚好也是32个bit位,所以 0x11223344 刚好把int类型的a放满

 int* pa = &a;

把int类型的a的地址取出来,存放入同类型的指针变量pa中 

*pa = 0; 

通过pa所存放的地址解引用找到a的空间,并赋值为0 

从内存的角度看a的变化: 

左侧的 0x012FF724a的首地址, 且a为4个字节,所以从 0x012FF724 到下一个地址 0x012FF728 相差了4个字节

或者可以将内存的列数显示为1,可以更直观的看到a所占内存空间

 当程序继续往下运行,通过pa是否能改变a的值

a的值确实通过pa解引用改变了

当pa的指针变量类型改为char*时,是否还能改变a的值呢? 

#include<stdio.h>
int main()
{
	int a = 0x11223344;
	
	char* pa = &a;

	*pa = 0;

	return 0;
}

同样通过内存查看a的变化

可以看到,只改变了变量a的首地址的值

得出结论:

int*的指针解引用访问4个字节

char*的指针解引用访问1个字节

………………

结论:指针类型可以决定指针解引用的时候访问多少个字节(指针的权限)


 指针+-整数

#include<stdio.h>
int main()
{
	int a = 0x11223344;
	
	int* pa = &a;
	char* pc = &a;

	printf("pa = %p\n", pa);
	printf("pc = %p\n", pc);
	
	printf("pa+1 = %p\n", pa+1);
	printf("pc+1 = %p\n", pc+1);

	return 0;
}

int类型的变量a 的地址放入 int*类型的指针变量pa char*类型的指针变量pc

分别以地址的形式(%p)打印pa和pc,以及pa+1和pc+1

pa和pc:因为指针变量 pa 和 pc 都是存储的a的首地址,所以打印pa和pc是相同的

pa+1:因为pa是int*类型的指针变量,加一表示向后跳过自身长度的一,所以向后跳了4个字节的长度,00AFF850 - 00AFF84C = 4

pc+1:因为pa是char*类型的指针变量,所以加一向后跳了1个字节,00AFF84D - 00AFF84C = 1

得出结论:

指针类型决定了指针+/- 1操作时的步长

整型类型指针+1跳过 sizeof(int) 个字节

字符类型指针+1跳过 sizeof(char) 个字节

………………

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值