指针变量类型的意义和const的用法

指针变量类型的意义

指针变量的大小和类型无关,只要是指针变量,在同一个平台下,大小都是一样的,那为什么还需要各种各样的指针类型呢?

其实指针类型是有特殊意义的,我们接下来继续学习。

指针的解引用

对比,下面的两段代码,主要在调试过程中观察内存的变化

指针变量类型的意义和const的用法_第1张图片

第二种:

指针变量类型的意义和const的用法_第2张图片 

根据调试结果我们可以知道,代码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;
}

指针变量类型的意义和const的用法_第3张图片

这个是代码运算的结果

我们可以看到,int*每次+1都是扩大了4个字节,char*每次+1都是扩大了1个字节

所以,指针的类型决定了指针向前+1或者-1的距离有多大。

void*指针

在指针类型中有这样的一个指针,void*指针,它可以接收任何类型的地址数据传输,但是缺点是不能进行指针的+-整数和解引用的运算。

我们来看一个例子:

#include
int main()
{
	int num = 10;
	int* pa = #
	char* pc = #
	return 0;
}

指针变量类型的意义和const的用法_第4张图片 

 我们来看一个void*的例子:

#include
int main()
{
	int num = 10;
	int* pa = #
	void* pc = #

	return 0;
}

指针变量类型的意义和const的用法_第5张图片 

指针变量类型的意义和const的用法_第6张图片 

我们可以看到void*的不可以进行+-整数和解引用运算。

const修饰指针

const修饰变量

变量是可以修改的,即使把变量的值给了指针,也是可以通过修改指针来达到修改变量的目的的,如果我们想要对修改变量做出一些限制,使得变量无法被修改,这个就是const的作用。

 指针变量类型的意义和const的用法_第7张图片

#include
int main()
{
	int num1 = 10;
	num1 = 20;//num1是可以修改的。
	const num2 = 10;
	num2 = 20;//num2是不可以修改的。

	return 0;
}

在上述代码中,num2是无法被修改的,这个就是const的作用。

如果我们绕过num2,通过修改num2的地址来达到修改num2的目的,结果会怎么样呢,让我们来看看。

指针变量类型的意义和const的用法_第8张图片 

这样子的话,结果显示修改成功了,这种就是属于打破语法规则的做法,那,如果我们最初的目的是想要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在右面的时候,修饰的是指针变量本身的内容,表示指针变量本身的内容无法被改变,但是指针变量所指向的内容是可以改变的。

 

 

 

你可能感兴趣的:(数据结构,c语言,开发语言)