C语言指针1

 

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。

先看这样一段代码,定义一个整型变量a和整型指针变量p,把a的地址赋给p,输出a的地址,p,p的地址。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a;
	int *p;
	p = &a;
	printf("%d %d %d\n", &a, p, &p);
	system("pause");
	return 0;
}

输出结果

注意:只能将地址赋给指针变量。

例如:

	int *p;
	p = 100;

这样的赋值是错误的,不能将一个数直接赋给指针变量。

	int *p;
	int a;
	p = &a;

指针是用来存放变量地址的,所以这样的赋值是合法的。

所有的指针变量都是4个字节

看这样一段代码:
 

#include<stdio.h>
#include<stdlib.h>
struct ABC
{
	int a;
	char b;
};
int main()
{
	int *p;
	char *q;
	float *i;
	struct ABC *n;
	printf("%d %d %d %d\n", sizeof(p), sizeof(q), sizeof(i),sizeof(n));
	system("pause");
	return 0;
}

输出结果:

&和*

&:取地址运算符         取出变量存放的地址

*:间 接运算符            取出储存在地址中的对应值

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a = 10;
	int *p;
	p = &a;
	printf("p:%d\n&a:%d\n*p:%d\na:%d\n&p:%d\n", p, &a, *p, a, &p);
	system("pause");
	return 0;
}

输出结果:

a里面存的是10,a有它对应的地址5240736,p里面存的是a的地址,p也有它对应的地址。

看下面一段代码
 

#include<stdio.h>
#include<stdlib.h>
void swap1(int x, int y)
{
	int temp;
	temp = x;
	x = y;
	y = temp;
}
void swap2(int *x, int *y)
{
	int temp;
	temp = *x;
	*x = *y;
	*y = temp;
}
int main()
{
	int a=100, b=200;
	//swap1(a, b);
	swap2(&a, &b);
	printf("%d %d", a, b);
	system("pause");
	return 0;
}

这段代码中,swap1里面交换了x,y的值,swap2里面也交换了x,y的值,但最后只有swap2交换了a,b的值。

原因:

       在函数在调用时,形参才会被分配内存,当函数调用结束时,形参的生命周期也就完结,自动释放,所以不会影响主函数a,b的值;在函数里面x,y的值交换了,但是不会影响a,b。

       而swap2把a,b的地址传给形参,通过地址,找到a,b的值,对a,b进行了调换。

       举个例子解释:教室的桌子上放着个纸条上面写着(10,100),你人在家里想要调换这两个值,swap1就相当于你在家自己拿张纸条写了个(100,10),然后扔掉,教室里面的纸上面数字并没有改变。swap2就相当于你在家拿纸条写上了10和100的地址(位置),然后通过地址找到教室,把教室里面的纸上面的数字进行改变,然后把写有地址的那张丢掉,所以教室里的纸上面数字进行了交换。

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值