指针变量的大小和类型无关,只要是指针变量,在同一个平台下,大小都是一样的,那为什么还需要各种各样的指针类型呢?
其实指针类型是有特殊意义的,我们接下来继续学习。
对比,下面的两段代码,主要在调试过程中观察内存的变化
第二种:
根据调试结果我们可以知道,代码1会将a的4个字节全部改为0,但是第二个只会将a的第一个字节改为0.
所以:指针的类型决定了,对指针解引用的时候有多大的权限(一次能操作几个字节)。
比如,char*的指针解引用就只能访问一个字节,而int*的指针的解引用可以访问4个字节。
先看一个例子,调试观察地址的变化。
#include
int main()
{
int num = 10;
int * pa = #
char* pc = (char)num;
printf("&num = %p\n", &num);
printf("pc = %p\n", pc);
printf("pc+1 = %p\n", pc + 1);
printf("pa = %p\n", pa);
printf("pa+1 = %p\n", pa+1);
return 0;
}
这个是代码运算的结果
我们可以看到,int*每次+1都是扩大了4个字节,char*每次+1都是扩大了1个字节
所以,指针的类型决定了指针向前+1或者-1的距离有多大。
在指针类型中有这样的一个指针,void*指针,它可以接收任何类型的地址数据传输,但是缺点是不能进行指针的+-整数和解引用的运算。
我们来看一个例子:
#include
int main()
{
int num = 10;
int* pa = #
char* pc = #
return 0;
}
我们来看一个void*的例子:
#include
int main()
{
int num = 10;
int* pa = #
void* pc = #
return 0;
}
我们可以看到void*的不可以进行+-整数和解引用运算。
变量是可以修改的,即使把变量的值给了指针,也是可以通过修改指针来达到修改变量的目的的,如果我们想要对修改变量做出一些限制,使得变量无法被修改,这个就是const的作用。
#include
int main()
{
int num1 = 10;
num1 = 20;//num1是可以修改的。
const num2 = 10;
num2 = 20;//num2是不可以修改的。
return 0;
}
在上述代码中,num2是无法被修改的,这个就是const的作用。
如果我们绕过num2,通过修改num2的地址来达到修改num2的目的,结果会怎么样呢,让我们来看看。
这样子的话,结果显示修改成功了,这种就是属于打破语法规则的做法,那,如果我们最初的目的是想要num1无法被修改,我们可以通过什么来进行操作呢。
大家来分析一段代码:
void test1()
{
int x = 20;
int y = 10;
int* pa = &x;
*pa = 20;
pa = &y;
}
void test2()
{
int x = 20;
int y = 10;
const int* pa = &x;
*pa = 20;
pa = &y;
}
void test3()
{
int x = 20;
int y = 10;
const int const * pa = &x;
*pa = 20;
pa = &y;
}
void test4()
{
int x = 20;
int y = 10;
int const* pa = &x;
*pa = 20;
pa = &y;
}
#include
int main()
{
test1();
test2();
test3();
test4();
return 0;
}
j结论,当const修饰指针变量的时候:
当const在左面的时候,修饰的是指针变量所指向的内容,表示指针变量指向的内容无法被改变,但指针变量是可以改变的。
当const在右面的时候,修饰的是指针变量本身的内容,表示指针变量本身的内容无法被改变,但是指针变量所指向的内容是可以改变的。