C语言指针(二)

如何通过被调函数修改主调函数普通变量的值

  1. 实参必须为该普通变量的地址
  2. 形参必须为指针变量
  3. 在被调函数中通过 *形参名 的方式就可以修改主调函数相关变量的值

指针和数组

指针和一维数组

  • 数组名
    一维数组名是个指针常量,它存放的是一维数组第一个元素的地址
int a[5];

printf("%#X\n", &a[0]); //34FE3433
printf("%#X\n", a);  //34FE3433
  • 下标和指针的关系
    如果p是个指针变量,则p[i] 永远等价于 *(p+i)
# include <stdio.h>

int main(void)
{
	int a[5];
	printf("%d\n", a[0]); //输出结果为一个垃圾值
	
	int b[5] = {1, 2, 3};
	printf("%d, %d\n", b[1], b[4]); // 输出结果  2, 0,说明为负值的元素初始化为0
	
	int c [5] = {1, 2, 3, 4, 5};
	printf("%d\n", c);// 输出6487488,是数组c的地址
	printf("%d\n", &c[0]); //输出6487488,是数组c第一个元素的地址
	
	// 结论:这说明数组名是一个指针常量,即c是int *类型,他存放了第一个元素的地址,
	//可以说明数组名和第一个元素是,通过使用数组变量名访问到第一个元素
	
	printf("%d\n", *c);  // 输出1,是第一个元素的值
	printf("%d\n", *(c+3)); // 猜想?这里应该输出4   OK 
	
	if (c[2] == *(c+2))
	{
		printf("你的推导是正确的\n");  //执行语句  OK 
	}
	else
	{
		printf("你的推导错误\n");	
	} 
	// ==>  c[i] = *(c+i);
	 
	return 0;
}

确定一个一维数组需要几个参数【如果一个函数要处理一个一维数组,则需要接收该数组的那些信息】
需要两个参数,一个数组的首地址(数组名),一个是数组长度

# include <stdio.h>

void f(int *pArr, int len)
{
	int i;
	
	for (i=0; i<len; i++)
		printf("%d ", *(pArr+i)); //*(pArr+i)等价于 pArr[i] 也等价于 b[i] 也等价于 *(b+i)
	printf("\n");
}
int main(void)
{
	int a[5] = {1, 2, 3, 4, 5};
	int b[6] = {34, 34,23, 13};
	
	f(a, 5);
	f(b, 6);
	
	return 0;
}

在函数f中操作pArr数组,等价与在主函数中操作b数组,因为他两是一个东西或者arr就是b的一个副本,这事指针的一个重要作用。
数组的地址
在这里插入图片描述
指针变量的地址

int main(void)
{
	char ch = 'A';
	int i = 99;
	double x = 66.6;
	
	char * p = &ch;
	int * q = &i;
	double * r = &x;
	
	printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r));  // 4  4  4 
	
	return 0;
}

在这里插入图片描述
为什么指针变量的大小为4字节,这是因为:
1. 指针变量存放的是地址
2. 地址取变量的首地址做代表,再根据指针变量的类型确定 指针变量内容为地址变量的大小。
3. 地址使用4字节(32位电脑,如果是64位电脑则8位)来存放的
第三点比较难理解,为什么地址要用4字节来存放,因为32位的电脑,地址总线空32根,所有地址编号就有2^32中,一个字节等于8位,所有需要4个字节来存储2 ^ 32中状态,也就是4GB的内存。

  • 指针变量的运算
    指针变量不能相加 不能相乘 也不能相除
    如果两个指针变量指向的是同一块连续空间中的不同存储单元,则这两个指针变量才可以相减
int main(void)
{
	int i = 5;
	int j =10;
	int * p = &i;
	int * q = &j;

	//p - q  // 没有实际意义
	
	int a[5];
	p = &a[1];
	q = &a[4];
	printf("p和q所指向的单元相隔%d个单元\n", q-p);   // 3
}
2

指针和二维数组

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值