C语言指针(二)
程序员文章站
2024-02-20 23:34:10
...
如何通过被调函数修改主调函数普通变量的值
- 实参必须为该普通变量的地址
- 形参必须为指针变量
- 在被调函数中通过 *形参名 的方式就可以修改主调函数相关变量的值
指针和数组
指针和一维数组
- 数组名
一维数组名是个指针常量,它存放的是一维数组第一个元素的地址
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
指针和二维数组
上一篇: OpenCV--041:Triangle二值寻找算法
下一篇: 设计模式:9.UML类图和类的关系