指向2D数组的指针

时间:2011-09-08 07:22:25

标签: c pointers multidimensional-array

我有一个像这样的二维数组...

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再见早晨

我在分配指向此数组的指针和通过指针打印数组时遇到问题 请帮忙......

1 个答案:

答案 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这样简单的事情并不能为这种情况创建适当的内存布局。

相关问题