二维指针(指向指针的指针)

参考博主:https://blog.youkuaiyun.com/liuweiyuxiang/article/details/84769438

看一下 下面的代码:

#include<stdio.h>
int find(char *s, char src, char *rt)//从s中查询出src字符所在的位置并在rt中返回。
{
	int i = 0;
	while (*(s + i))
	{
		if (*(s + i) == src)//只会出现一次满足条件,此时将此地址给*rt,即p
		{
			rt = s + i;//这里修改了p的指向
		}
		i++;
	}
	return 0;
}


int main(void)
{
	char a[10] = "zhuyujia";
	char *p = NULL;
	printf("%p", p);
	find(a, 'y', p);//改变p的指向,在子函数中实现
	printf("%s", p);
	printf("%p", p);
	getchar(); getchar();
	return 0;
}

输出:00000000(null)00000000

 

#include<stdio.h>
char* find(char *s, char src, char *rt)//从s中查询出src字符所在的位置并在rt中返回。
{
	int i = 0;
	while (*(s + i))
	{
		if (*(s + i) == src)//只会出现一次满足条件,此时将此地址给*rt,即p
		{
			rt = s + i;//这里修改了p的指向
		}
		i++;
	}
	return rt;
}


int main(void)
{
	char a[10] = "zhuyujia";
	char *p = NULL;
	printf("%p", p);
	p=find(a, 'y', p);//改变p的指向,在子函数中实现
	printf("%s", p);
	printf("%p", p);
	getchar(); getchar();
	return 0;
}

输出:00000000yujia00B3FC23

第一段代码 由传入的是指针(地址),虽然在程序中改变了这个地址 但因为这个指针式局部变量 (形参)他不会改变实参的值(地址)所以输出依然式0;

第二个 我直接返回了形参的值,是没问题的;

#include<stdio.h>
int find(char *s, char src, char **rt)//从s中查询出src字符所在的位置并在rt中返回。
{
	int i = 0;
	while (*(s + i))
	{
		if (*(s + i) == src)//只会出现一次满足条件,此时将此地址给*rt,即p
		{
			*rt = s + i;//这里修改了p的指向
		}
		i++;
	}
	return 0;
}


int main(void)
{
	char a[10] = "zhuyujia";
	char *p = NULL;
	printf("%p", p);
	find(a, 'y', &p);//改变p的指向,在子函数中实现
	printf("%s", p);
	printf("%p", p);
	getchar(); getchar();
	return 0;
}

这一段代码 我传入的是 指针变量的地址


void swap(int a) {
	a = 10;
}

void swap(int *a) {
	*a = 10;
}
int main(void)
{
	int a = 0;
	int* p = &a;
	swap(a);
	printf("%d", a);
	swap(p);
	printf("%d", a);
	getchar();
}

道理其实和我这段代码的到理是一样的,指针也是变量 也需要通过地址来改变;

总的来说 如果你传入的参数是指针 并且你希望改变这个 指针的地址 那么 就考虑 指针的指针;

发现还是有点混淆:

#include <iostream>
using namespace std;
void print(const char **str)
{
	++*str;
	cout << *str << endl;
}
int main()
{
	const char *arr[] = { "hello", "world", "c++" };
	const char **ptr;
	ptr = arr;
	print(ptr);
	return 0;
}

输出的是ello;

#include <iostream>
using namespace std;
void print(const char **str)
{
	++str;
	cout << *str << endl;
}
int main()
{
	const char *arr[] = { "hello", "world", "c++" };
	const char **ptr;
	ptr = arr;
	print(ptr);
	return 0;
}

输出的是world;

看看怎么理解 arr其实就是二级指针 {。。。}里面的是二维 数据 arr++处理的是第二 维的数组 *arr 是第一维的数组啦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值