c语言---指针(1)

目录

&取地址操作符

*解引用操作符

指针变量大小

指针类型的意义

void*

const

const修饰变量:

const修饰指针:

野指针


&取地址操作符

	int a = 10;//1、创建一个变量a,并赋值为10;2、在内存上申请一个4个字节的空间
	printf("%p\n", &a);//%p专门打印地址

*解引用操作符

int main()
{
	int a = 10;
	printf("%p\n", &a);

	int* pa = &a;//pa是指针变量--存放地址--地址又被称为指针,指针变量是用来存放指针的
	*pa = 20;//*解引用操作符
	//也就是等于a=20;
	return 0;
}

int* pa = &a

1、*:说明pa是指针变量

2、int:说明pa指向的对象是int类型

指针变量大小

指针变量是专门用来存放地址的,指针变量的大小取决于一个地址存放需要的空间。

32位机器上:地址线是32根,地址的二进制序列就是32bite位----要把这个地址存起来,就需要4个字节的空间,也就是32bite的空间。

所以32位机器上指针变量的大小就是4个字节。

同理,64位机器上指针变量的大小是8个字节。

int main()
{
	int a = 0x11223344;
	char* pa = &a;//?这里pa可以存放下a的地址吗?---当然可以,pa是一个指针变量,大小是8个字节

	*pa = 0;//但是这时改动的只有一个字节
	printf("%d\n", &a);
}

指针类型的意义

int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	printf("%p\n", pa);
	printf("%p\n", pc);

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

打印结果:

000000C7CBBCF7F4
000000C7CBBCF7F4
pa+1=000000C7CBBCF7F8
pc+1=000000C7CBBCF7F5

解释:

因为char *和int *的指针类型不同造成pa+1和pc+1的不同

void*

	int a = 10;
	int* pa = &a;
	char* pc = &a;

对于上面的代码,虽然可以正常运行,但是会出现一个警告

 怎么去解决这个warning?

1、将    char* pc = &a;改为:char* pc = (char *) & a;

2、将    char* pc = &a;写成:   void* pc = & a;// void 指针可以指向任意类型的数据;

int main()
{
	int  a = 10;
	char c = 'w';
	//int* pa = &a;
	//char* pc = &a;//警告

	void* pv = &a;
	void* pv1 = &c;//并不会报警告

	//*pv = 20;//err void *类型的指针 不能直接进行解引用操作
	//pv++;//err
}

const

const修饰变量:

int main()
{
	int a = 10;
	a = 20;//修改
	const int a = 10;
	a = 20;//不可修改,但是a的本质还是变量,const,仅仅是在语法上做了限制,a叫常变量
	printf("%d", a);
}

const修饰指针:

const修饰指针的时候:

(1)const可以放到*左边;

(2)const也可以放到*右边;

左边:

const int *pa和int const *pa其实是等价的

const限制的都是*pa 

限制的是*pa:不能通过pa来修改pa指向的空间的内容

	const int a = 10;
	const int* pa = &a;
	*pa = 1;//不能修改
	printf("%d", a);

右边:

int *const pa,const限制的是pa而非*pa


	const int a = 10;
	int*const pa = &a;
	*pa = 1;//可以修改,因为const在*右边限制的是pa,并不是*pa
	printf("%d", a);

int main()
{
	int a = 10;
	int c = 1;
	int const* pa = &a;
	//*pa = 0;
	printf("%p\n",pa);

	pa = &a;
	printf("%p\n", pa);
	pa = &c;
 	printf("%p\n",pa);
}

还是上面的图

pa里面存放的是a的地址;

pa=&a;意思是将pa里面存放的值改为a的地址;

pa=&c;意思是将pa里面存放的值改为c的地址;

pa里面存放的地址是a的地址;

pa是变量,它有它自己的地址;

*p是p指向的空间;

野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。

造成野指针的原因:

指针未初始化;

指针越界访问;

指针指向空间释放;

如何规避:

1、初始化

2、小心越界

3、及时置NULL

希望有所帮助!

  • 21
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值