指向指针的指针
#include<stdio.h>
int main()
{
int x = 5;
int* p0 = &x;
int** p1 = &p0;
int*** p2 = &p1;
printf("address of p0 = %d\n", p0);
printf("address of *p0 = %d\n", *p0);
printf("address of *p1 = %d\n", *p1);
printf("address of **p1 = %d\n", **p1);
printf("address of ***p2 = %d\n", ***p2);
***p2 = 10;
printf("x = %d\n", x);
**p1 = *p0 + 2;
printf("x = %d\n", x);
printf("size of p1 = %d", sizeof(p1));
}
结合代码和图看一下不难,套娃 – –
传值和传引用
传值
写一段程序说明
#include<stdio.h>
void addnumber(int a)
{
a += 1;
}
int main()
{
int a = 10;
addnumber(a);
printf("a = %d\n", a);
}
你觉得结果是多少?
结果是10 匪夷所思 明明把a传进去了 为什么没有用??因为main函数的a
和addnumber函数的a
不是一个a
打印出两个a 证明事实确实是如此 为什么会不一样??有疑问就是好的,没有疑问大家都不用学习了
see the pic:
一下内容涉及一些内存的知识,内存对学编程的人来说多重要不言而喻
程序在系统上运行开始时,会在系统中开辟一块内存,用来存放程序的数据 代码等等
程序开始执行main
函数 会在栈中压入参数 局部变量返回地址 以及正在执行的指令等等信息 当程序执行到函数addnumber
会在栈开辟一块新的区域存放这个函数的的信息 两者并不是一块内存的数据 因此本函数中的a和main函数中的a并不是一个东西 在addnumber函数执行完之后 栈会清空这个函数的所有信息 包括’a’ 然后在继续回到main执行其他函数
再通过参数传递的方式说明一下
值传递
将实参的值赋给形参,形参不能改变实参
。传递的过程相当于在函数内部重新定义与实参同类型的变量,再把实参的值赋给该变量
规则:
- C语言中参数传递本质都是值传递(引用传递是C++中的概念)
- 形参只在调用时分配内存,调用结束时释放内存,形参被销毁。
- 参数传递是单向的,只能由实参传给形参。
- 形参只是实参的一份拷贝,形参的改变对实参本身没有影响。
注意:如果指针或者地址作为实参传入函数,指针指向的内容或者地址存放的数据是可以改变的,但是指针的值和地址本身是不会改变的。
通过一个程序辨析一下
#include<stdio.h>
void swap(int *x,int*y)
{
int* temp = NULL;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 5;
int b = 10;
int* p1 = &a;
int* p2 = &b;
swap(p1, p2);
return 0;
}
运行结果
代码首先把a和b的地址作为实参传给了swap函数的形参也就是说 int* x = p1;
int* y = p2; 由此就能知道swap里面交换的是p1和p2指针的值地址 也就是拷贝a b的地址给形参 然后通过x y这两个指针交换 a b两个地址 实际交换的是x y指针指向的地址 与实参的a b并没有关系 就比如你把你的书借给了你的同学 他学会了你就学会了吗?
#include<stdio.h>
void swap(int *x,int*y)
{
int* temp = NULL;
printf("x = %d y = %d\n", x,y);
temp = x;
x = y;
y = temp;
printf("x = %d y = %d\n", x, y);
}
int main()
{
int a = 5;
int b = 10;
int* p1 = &a;
int* p2 = &b;
printf("a = %d\n", &a);
printf("b = %d\n", &b);
//printf("p1 = %d\n", &p1);
//printf("p2 = %d\n", &p2);
swap(p1, p2);
printf("a = %d b= %d\n", a, b);
return 0;
}
传引用
如果要实现交换a b值的效果,不通过形参修改实参就可以,下面介绍两种方法
#include<stdio.h>
void swap(int *x,int*y)
{
printf("xy交换前的地址\n");
printf("x = %d y=%d\n", x, y);
printf("------------\n");
int temp = 0;
temp = *x;
*x = *y;
*y = temp;
}
int main()
{
int a = 5;
int b = 10;
int* p1 = &a;
int* p2 = &b;
printf("交换前ab的地址\n");
printf("a = %d\n", &a);
printf("b = %d\n", &b);
printf("------------\n");
printf("p1 = %d\n", p1);
printf("p2 = %d\n", p2);
printf("------------\n");
swap(&a, &b);
printf("交换后ab的地址\n");
printf("a = %d\n", &a);
printf("b = %d\n", &b);
printf("------------\n");
printf("p1 = %d\n", p1);
printf("p2 = %d\n", p2);
printf("------------\n");
printf("a = %d b= %d\n", a, b);
return 0;
}
这改变的是传入地址的内容 并不是改变改变传入的地址 因此有效
网站标题:CV鼻祖洋芋
原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c-2/80/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!