目录
我们都知道变量有不同的类型,有整型,浮点型等,指针当然也有不同的类型,下面我们就来介绍一下关于指针类型的问题。
指针变量的大小问题
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个值没变。