<C语言>[char**]与[malloc]的组合使用

本文通过实例解析了char**的概念,介绍了如何使用和管理char**指针,包括malloc动态内存分配,并展示了如何在函数间传递和操作多个字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先!要搞懂char**是什么?

我们知道char*是字符指针,是一个地址,指向一个字符串。

那么char**就是指向char*的指针,也是一个地址,指向指针的指针(好烦)。

使用char**的时候,通常是用作函数参数。

为了深入理解呢,我们直接定义使用,然后配合malloc(申请内存)来展示

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i;
	int n;
	scanf("%d",&n);//n为字符串个数 
	char **a=(char**)malloc(sizeof(char*)*n);//申请有n个字符串的内存 
	for(i=0;i<n;i++)
	{
		//指针可以用数组来表示 
		a[i]=(char *)malloc(sizeof(char)*5);//申请字符串的大小 
		scanf("%s",a[i]);
	}
	for(i=0;i<n;i++)
	{
		printf("%s\n",a[i]);
		free(a[i]);//释放每个字符串的内存 
	}
	free(a);//释放指向指针的a指针的内存 
	return 0;
}

这样是不是char**就很好理解了呢!

如有错误,还请大家批评指正 !!!

### C语言中 `char **p` 和 `char *p` 的区别 #### 定义上的差异 `char *p` 是一个指向字符 (`char`) 类型数据的指针变量。它存储了一个地址,该地址指向一块内存区域中的单个字符[^1]。 而 `char **p` 则是一个指向指针类型的指针变量。具体来说,`char **p` 存储的是另一个指针变量的地址,这个被指向的指针变量又指向了一块内存区域中的某个字符或者字符串[^3]。 --- #### 占用空间的不同 假设当前环境是在 32 位系统下运行,则每种指针类型占用的空间大小相同(通常为 4 字节)。因此: - 对于 `char *p`,其本身只占用了 4 字节来保存所指向的目标地址。 - 而对于 `char **p` 来说,虽然它的定义更复杂一些,但它同样也只是用来保存一个地址值,所以也仅需 4 字节即可完成这一功能[^3]。 不过需要注意的是,在实际应用当中如果涉及到数组操作的话可能会存在不同情况下的表现形式差异。 --- #### 使用场景对比分析 当需要处理简单的字符串时可以选择使用 `char *p` 进行声明;但如果要管理多个独立分配出来的动态字符串或者是二维字符矩阵等情况之下就需要运用到双重间接寻址即采用 `char **p` 形式的变量来进行编程设计了。 以下是两个具体的例子展示它们各自的用途以及如何初始化这些不同类型的数据结构: ```c // Example of using char * #include <stdio.h> int main(){ char str[] = "hello world"; char *ptr = str; while(*ptr != '\0'){ putchar(*ptr); ptr++; } } ``` 上面这段程序展示了怎样利用单一层次的指针访问并打印出整个字符串的内容。 而对于双层指针的应用则有如下示范代码所示: ```c //Example of using char ** #include<stdio.h> #include<stdlib.h> void freeStrings(char** strings,int num){ for(int i=0;i<num;i++)free(strings[i]); free((void*)strings); } int main(){ int n=5; char** names=(char**)malloc(n*sizeof(char*)); for(int i=0;i<n;i++){ size_t length=rand()%8+3;//random lengths between 3 and 10 characters. names[i]=(char *)malloc(length+1); //fill with random letters... ... } //use the allocated memory... freeStrings(names,n); return 0; } ``` 在这个案例里我们创建了一个由五个随机长度组成的字符串构成的一维表,并通过函数释放所有关联资源以防止泄露问题发生。 --- ### 总结 综上所述可以看出两者之间最本质的区别在于指向对象级别的深浅程度不一样——前者仅仅是指向基本单位的一个入口标记而已;后者则是进一步深入到了另一级抽象层面之上成为了连接更多同类实体之间的桥梁纽带角色扮演者身份存在着显著的功能定位方面的差别[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值