我有一个像这样的二维数组...
char a[][20]={"Hi","Hello","Bye","Good Morning"};
现在我需要一个char指针来引用这个数组,通过指针修改数组中的一个字符串,并通过指针打印修改后的数组和数组......
对数组的修改:
strcpy(p+1,"Come");//copy string "Come" to array
a[1][1]='O';//copy char 'O' index [1][1]
ie ..预期输出:
数组:嗨COme Bye早安
指针:嗨COme再见早晨
我在分配指向此数组的指针和通过指针打印数组时遇到问题 请帮忙......
答案 0 :(得分:0)
如果要将2D数组转换为指向char指针的指针数组,则要么必须在本地作用域的堆栈上为char**
分配空间,要么动态分配空间。如果你采用局部范围方法,那么你需要简单地创建一个char*
数组,然后让你的数组的每个成员指向每个字符串,如下所示:
char a[][20]={"Hi","Hello","Bye","Good Morning", "" };
int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;
char* ptrs[total_strings];
for (int i = 0; i < total_strings; i++)
{
ptrs[i] = a[i];
}
现在您可以使用像ptr[i][j]
这样的指针数组(其中j
小于索引i
处字符串的长度),如果需要将其传递给通过引用函数或将其分配给另一个变量,ptrs
数组会衰减成指针,因此您可以将ptrs
作为char**
传递给函数,或传递给另一个char**
变量。
下一种方法是动态分配指针数组......如下所示:
char a[][20]={"Hi","Hello","Bye","Good Morning", "" };
int total_strings = 0;
int index = 0;
while(strlen(a[index++])) total_strings++;
//dynamic allocation of string pointer array
char** ptrs = calloc(total_strings, sizeof(char*));
for (int i = 0; i < total_strings; i++)
{
ptrs[i] = a[i];
}
//...more code
free(ptrs);
顺便说一句,你不能做一些像char** ptr = a
这样简单的事情......这是因为C期望char**
的内存布局。换句话说,char array[][]
实际上是内存中的线性数组,即使它可以被索引为二维数组。另一方面,char** ptr
是一个变量,它包含指向指针数组的内存地址。因此ptr
必须包含指向正确指针数组的地址,并且每个指针ptr[i]
都需要包含指向char
数组的地址。做一些像char** ptr = a
这样简单的事情并不能为这种情况创建适当的内存布局。