[C语言]关于运用指针的问题。

今天在写程序的时候遇到了一个问题,就是指针和地址的问题,即* 和 &的问题。我在写指针操作的时候想证明,指针指向的地址,如果修改指针值的值会不会影响指针所指向地址的值。

首先我们了解一下指针是什么东西,可以顶一个int *p 的指针变量,sizeof( p),会得出值为4,这个4是4 byte,32bites,显然肯定不是整形的长度,可以sizeof(void *)也是4,说明了指针所占的空间是4Byte,显然,它是一个内存地址,也就是说,在32位系统上,指针变量是一个空间为4Byte的存储内存地址的空间。


我们把p 称为指针变量,p 里存储的内存地址处的内存称为p 所指向的内存,一个基本类型加上*就够成了指针类型的模子,这个模子的大小是一定的(根据操作系统的位数),与*前面的类型无关,*前面的类型只能说明其指针变量所指向的内存地址中能够存储的类型。

下面看两个程序个程序:

int main()
{
int *a;
int  b;
*a = 2;
printf("%d",*a);
return 0;
}

int main()
{
int *a;
int b =2;
a = &b;
printf("%d",*a);
return 0;
}

第一个程序编译通过但执行错误是有问题的,第二个程序编译通过,执行结果正确。说明了*符号表示的是地址,为什么*a=2编译通过呢,因为在*运算时,编译器将*a解释成a地址所对应存储的值,为什么执行的时候出错呢,因为你在初始化的时候a指向的地址是随机的,a可能指向的是一个无权访问的地址,或者a指向是随机的,当编译器执行的时候并不知道你具体是哪个地址,那么怎么才能将值存放到指定的内存里呢,看下面的程序。

int main()
{
int *a =(int*)0x22222;
int b =2;
*a = 3333;
printf("%d",*a);
return 0;
}

这里初始化的时候首先给指针a初始化了一个内存地址,这里必须强制类型转换,因为C是 强类型语言,这时a内存中存储的是0x22222这个地址,也即a指向了0x22222这个内存地址,然后下面*a = 3333中*a是指针的另外一个意义,即*的运算(指针的运算),意思是将a内存地址对应的值设置为3333,当然也可以用&操作符,&的意思是取变量的内存地址,如第二个程序所示a=&b,其实和上面的程序是一样的,只不过是反过来而已,第二个程序是将一个整形值2存到整形变量b的内存里,然后将b的内存地址保存到a指针的空间里,即保存了b的内存地址,而上面的程序则是先将a指向一个内存地址,即保存一个变量的内存地址,然后,将3333保存到a保存的地址所对应的的内存空间里。其实二者意思是一样的,只是方式不一样而已。所以我们这样写*(int *)0x22222 = 3333也是可以的。

下面了解一下指针操作的性质,操作指针会不会影响指针所指向的内存地址中的值呢。看一下一个程序。

int main()
{
int *a;
int *b;
int c = 2;
a = &c;
b = a;
*b=3;
printf("%d",*a); 
}

其值为3,也就是说改变指针变量的值,那么原来被指向的内存空间的值也发生改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值