零级指针到一级指针的推演
指针指向哪个变量,就是把相应的变量的地址赋值给他
不断改变指针变量的值,只是不断修改它的指向,但是原内存空间的内容不变
值传递和地址传递的区别本质上是通过这个钥匙是否操作了同一块内存(指针的精华:通过和指针变量可以操作同一块内存)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getFileLen(int * p)
{
*p = 100;
return *p;
}
int getFileLen2(int b)
{
b = 200;
return b;
}
int main(void)
{
int a = 10; //条件1 定义了两个变量(实参 另外一个变量是形参p)
int *p = NULL;
//修改a的值
a = 20; //直接修改
p = &a; //条件2 建立关联
*p = 30; //p的值是a的地址 *就像一把钥匙 通过地址 找到一块内存空间 求间接的修改了a的值
printf("a: %d \n", a);
{
*p = 40; // p的值是a的地址 *a的地址间接修改a的值 //条件3 *p
printf("a: %d \n", a);
}
getFileLen(&a);
printf("getFileLen以后a: %d \n", a);
getFileLen2(&a);
printf("getFileLen2以后a: %d \n", a);
system("PAUSE");
return 1;
}
一级指针到二级指针的推演
实际上所谓的值传递和地址传递都是值传递,实参传递给行参的时候都是进行一份数据的拷贝;
如果同级指针之间进行传递,比如实参和形参都是零级指针,这时候就是最容易让人理解的值传递,大家都知道这样在被调函数里对形参的修改不会影响实参;同理如果实参和形参都是一级指针,在被调函数里又没有通过*进行间接修改的话,被调函数的修改也不会影响主调函数的实参;
对于被调函数能否修改主调函数实参的内容,关键是看在被调函数里是否存在使用*进行间接访问,或者存在数组的下标访问,这两种访问都是一种间接访问的方式。
如果想修改一级指针的值,那么形参要用二级指针;
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int getMem3(char **myp1, int *mylen1, char **myp2, int *mylen2)
{
int ret = 0;
char *tmp1, *tmp2;
tmp1 = (char *)malloc(100);
strcpy(tmp1, "1132233");
//间接赋值
*mylen1 = strlen(tmp1); //1级指针
*myp1 = tmp1; //2级指针的间接赋值
tmp2 = (char *)malloc(200);
strcpy(tmp2, "aaaaavbdddddddd");
*mylen2 = strlen(tmp2); //1级指针
*myp2 = tmp2; //2级指针的间接赋值
return ret;
}
int main()
{
int ret = 0;
char *p1 = NULL;
int len1 = 0;
char *p2 = NULL;
int len2 = 0;
ret = getMem3(&p1, &len1, &p2, &len2);
if (ret != 0)
{
printf("func getMem3() err:%d \n", ret);
return ret;
}
printf("p1:%s \n", p1);
printf("p2:%s \n", p2);
if (p1 != NULL)
{
free(p1);
p1 = NULL;
}
if (p2 != NULL)
{
free(p2);
p2 = NULL;
}
printf("p1:%d \n", p1);
system("pause");
return ret;
}
间接赋值(指针作函数参数)存在的意义
通过间接赋值可以操作特定的内存
指针作为函数参数使得不同函数之间可以操作同一块内存
指针作为函数参数使得主调函数和被调函数可以同时操作某个变量或者某块内存,使得在被调函数里进行运算的结果可以传递到主调函数,这里的结果强调的是多个变量或者多块内存,从而实现软件的分层模型,进一步推演出接口的封装和设计
函数调用时,用实参取地址,传给形参,在被调用函数里面用*p,来改变实参,把运算结果传出来
间接赋值成立的条件
条件一:对每一个要进行间接赋值的变量或者内存空间声明两个成对的变量
条件二:让上述两个变量建立关联(低级指针变量取地址赋值给另一个高一级的指针变量或者函数调用传递参数)
条件三: 使用间接访问操作符
间接赋值的应用场景
三个条件同时出现在一个函数内(最简单的方式)
第一二个条件出现在一个函数,第三个条件单独出现在被调函数(指针作函数参数)
第一个条件单独出现在一个函数。第二第三个条件一起出现在别的地方(C++知识点)
间接赋值推论
函数调用时,用n级指针(形参)改变n-1级指针(实参)的值。