2.12一级指针作为函数形参和返回值
【注:自己从老师讲解出理解的,不对的地方望指正】
【注:本程序验证是使用vs2013版】
#include <stdio.h> #include <stdlib.h> #include <string.h> #pragma warning(disable:4996) void fun(int *p){ p = 0xaabb; printf("fun:p= %p\n", p); } void fun2(int **temp){ *temp = 0xbbcc; printf("fun2:*temp= %p\n", *temp); } int *fun3(int *p){ p = 0xccdd; printf("fun3:p= %p\n", p); return p; }
void get_num1(int src){ src += 1; } void get_num2(int *src){ *src += 1; //通过*操作内存 }
void get_num3(int **temp,int len){ int i = 0; for (int i = 0; i < len; i++) { *temp = i+1; //temp:代表的是传进来数组的首元素地址, *temp:代表的是首元素的值 temp++; //指针上移一位 } }
int main(void){ /* 一个变量,应该定义一个什么样类型的指针来保存它的地址 应该在原来的基础上加一个*来保存它的地址 */ int a = 100; int *b = &a; int **c = &b; int *********t1 = NULL; int **********t2 = &t1; /* 1.值传递:形参的修改不会影响到实参 2.地址传递:形参(通过*操作符号)的任何修改会影响到实参。 3.函数返回值:可以通过函数返回值来影响实参,不过一般返回值都作为状态判断使用。 4.地址传递和函数返回值相比的优点:通用性强,更加灵活 */ int *d = 0x1122; printf("d: %p\n", d);
fun(d);//这个是值传递,不是地址传递,(除了数组,名字就代表地址)地址传递需要在实参前面加&号 printf("d: %p\n", d);
fun2(&d);//地址传递,修改实参,需要加上&符号 printf("d= %p\n", d);
d = fun3(d);//通过函数返回值修改实参 printf("d= %p\n", d);
int e = 10; get_num1(e); //值传递 printf("e= %d\n", e);
get_num2(&e);//地址传递 ,需要加上&符号 printf("e= %d\n", e);
![](https://img2018.cnblogs.com/blog/1497165/201906/1497165-20190627050857826-911576406.png)
int f[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; int length = sizeof(f) / sizeof(f[0]); int i = 0; get_num3(f,length);//数组特殊,不加& 也是传递地址 for (int i = 0; i < length; i++) { printf("f[%d]=%d\n", i,f[i]); }
printf("\n"); system("pause"); return 0; }