关于指针,指针类型常见的问题

目录

指针变量的大小问题

指针类型的问题

指针的移动

指针的解引用


我们都知道变量有不同的类型,有整型,浮点型等,指针当然也有不同的类型,下面我们就来介绍一下关于指针类型的问题。

指针变量的大小问题

int main()
{
	int a = 10;
	int* pa = &a;
	printf("%d", sizeof(pa));
	return 0;
}

我们知道指针变量是用来存放地址的,那么它的大小是多少呢?

我们运行上面的代码

 

 那么问题来了,相同的代码为什么结果不一样呢?
原因在于一个是在32位平台下运行,一个是在64位平台下运行的,计算原理都是一样的,所占的字节数=系统的位数/8比特。这样就得到我们的指针的大小了。

int main()
{
	int a = 10;
	int* pa = &a;
	printf("%d\n", sizeof(char*));
	printf("%d\n", sizeof(int*));
	printf("%d\n", sizeof(float*));
	printf("%d\n", sizeof(double*));

	return 0;
}

那么不同类型的指针变量所占的字节大小分别是多少呢?接下来我们运行上述的代码。

我们可以看到在64位的系统下它们的大小都是8字节。

原因就是我们的指针变量存放的是地址,而地址的数量是由地址线来决定的64位平台下就是64根地址线除以每个字节所占的8个比特位就是我们指针变量所占的大小。


指针类型的问题

前面我们说到在64位的平台下指针类型的大小都是8字节,那么问题就来了,既然不同指针类型的大小都是8个字节那么为什么不搞一个通用的指针类型呢?反正大家存的都是地址。

指针的移动

int main()
{
	int a = 0x11223344;
	int* pa = &a;
	//*pa = 0;
	char* pc = &a;
	//*pc = 0;
	printf("%p\n", pa);
	printf("%p\n", pa+1);


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

	return 0;
}

我们分别定义两个类型的指针变量pa和pc都存放a的地址,然后打印出它们指向的下一个地址位

 我们可以看到 int类型的指针+1后地址向后移动了4个字节,而char类型的指针只是向后移动了1个字节

所以指针类型决定着指针向前或者向后走一步有多大(距离)

指针的解引用

int main()
{
	int arr[10] = {0};
	int* pa = arr;
	//char* pa = arr;

	for (int i = 0; i < 10; i++)
	{
		*(pa + i) = 1;
	}
	for (int j = 0; j < 10; j++)
	{
		printf("%d ", arr[j]);
	}
}

我们来看一下这段代码通过指针的解引用分别给每个数组赋值1

我们通过调试可以看到数组的存放的10个元素初始值都是0,然后我们通过指针的解引用对其赋值。

 赋值之后是这样的

每个地址指向的对象都变为了1 

整个代码执行下来结果如下

 完美的完成了赋值操作,当我们把int类型改成char类型会发生什么事呢‘

int main()
{
	int arr[10] = {0};
	//int* pa = arr;
	char* pa = arr;

	for (int i = 0; i < 10; i++)
	{
		*(pa + i) = 1;
	}
	for (int j = 0; j < 10; j++)
	{
		printf("%d ", arr[j]);
	}
}

结果如下:

为什么会这样呢?

我们来调试一下查看内存情况

 因为char类型一次只走1个字节,走完10次也就只走了两个半的int类型,所以后面的7个值没变。

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 25
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值