如何创建指向二维数组的指针数组
How can I create an array of pointers point to a 2 dimensional array
真不知道怎么解释。请多多包涵。
我尝试将二维数组传递给函数 string[][]
,在该函数中我将创建一个指向我传入的数组的指针。我将比较 string[][]
[= 中的元素20=]
//From main
char string[3][3] = {"cat","dog","bat"};
//From function
declare a pointer which points to string;
if (strcpm(string[1],string[2]) == 1)
{
pointer[1] value set to address of string[2];
pointer[2] value set to address of string[1]
}
printf("%s", *(pointer));
我不想修改string[3][3]
,然后函数会在没有return任何东西的情况下退出函数
我有想法,但是我不知道如何声明pointer
,请帮助我。谢谢!
可视化
In main In function
string ptr
cat 1000
dog 1008
bat 1012
Do compare
dog > bat
ptr[3] = address of dog;
ptr[2] = addess of bat;
printf("%s", *(ptr+1);
printf("%s", *(ptr+2);
quit function, return nothing
在 C 中,字符串表示为字符数组。这以两种正常方式表示,char* identifier
和 char identifier[]
。二维数组被声明为指向字符串的指针。所以,它可以写成
char **strArray1
char *strArray2[]
char strArray3[][]
每个都有不同的含义,我不会进入这里,因为它很迂腐。
为了尽可能按字面意思回答您的问题,您可以将 post 中的代码写为
int main (void) {
char * strArray[2] = { "This is a String", "This is a String too" };
if (strcmp(strArray[0], strArray[1]) == 0) {
...
}
return 0;
}
对于接受字符串数组(不是指向字符串的指针数组,这是不同的)的函数:
void func(size_t rows, size_t cols, char strings[rows][cols])
{
char const *pointers[rows];
// Initialize each pointer to point to each row
for (size_t i = 0; i < rows; ++i)
pointers[i] = &strings[i][0];
// here you can manipulate the pointers, e.g. bubble sort them
printf("%s\n", pointers[0]);
}
调用这个函数:
int main()
{
char stuff[4][20] = { "cat", "dog", "snuffleupagus", "horse" };
func(4, 20, stuff);
}
专业提示:您可以计算数组维度而不是使用幻数:
#define LENGTH_OF(array) ( sizeof(array) / sizeof((array)[0]) )
char stuff[][20] = { "cat", "dog", "snuffleupagus", "horse" };
func( LENGTH_OF(stuff), LENGTH_OF(stuff[0]), stuff );
如评论中所述,请注意第二个维度(20
在我的例子中)。 C 允许用恰好该长度的字符串初始化 char 数组,在这种情况下,数组最终将不包含字符串(即它将包含非空终止的字符)。
我不知道我是否理解正确,但如果我理解正确,我将发布一个示例,您可以在其中传递 "strings" 的数组(在 C 中表示为 char 数组的数组).然后你可以比较数组中的前两个字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* my_function(char *strings[]) {
char *ptrToString = NULL;
if (strcmp(strings[0],strings[1]) > 0) // Do you really mean '==1' here?
{
ptrToString = strings[1];
} else {
ptrToString = strings[0];
}
printf ("%s\n", ptrToString); // No need for '*', %s takes a pointer to char as argument
return ptrToString;
}
void main (void) {
char *a[] = {"dog", "cat"};
my_function(a);
}
备注:
* 我将 "strcmp() == 1" 更改为检查 return 是否为正数。检查特定值是非常规的(可能与您的 C 实现不匹配)。在文档中,唯一的保证是 strcmp 将 return 正数、负数或零,但不是特定值。
http://linux.die.net/man/3/strcmp
* 数组中必须至少有两个以 null 结尾的字符串,my_function 函数才能在没有段错误的情况下工作。
希望这能为您指明正确的方向。
真不知道怎么解释。请多多包涵。
我尝试将二维数组传递给函数 string[][]
,在该函数中我将创建一个指向我传入的数组的指针。我将比较 string[][]
[= 中的元素20=]
//From main
char string[3][3] = {"cat","dog","bat"};
//From function
declare a pointer which points to string;
if (strcpm(string[1],string[2]) == 1)
{
pointer[1] value set to address of string[2];
pointer[2] value set to address of string[1]
}
printf("%s", *(pointer));
我不想修改string[3][3]
,然后函数会在没有return任何东西的情况下退出函数
我有想法,但是我不知道如何声明pointer
,请帮助我。谢谢!
可视化
In main In function
string ptr
cat 1000
dog 1008
bat 1012
Do compare
dog > bat
ptr[3] = address of dog;
ptr[2] = addess of bat;
printf("%s", *(ptr+1);
printf("%s", *(ptr+2);
quit function, return nothing
在 C 中,字符串表示为字符数组。这以两种正常方式表示,char* identifier
和 char identifier[]
。二维数组被声明为指向字符串的指针。所以,它可以写成
char **strArray1
char *strArray2[]
char strArray3[][]
每个都有不同的含义,我不会进入这里,因为它很迂腐。
为了尽可能按字面意思回答您的问题,您可以将 post 中的代码写为
int main (void) {
char * strArray[2] = { "This is a String", "This is a String too" };
if (strcmp(strArray[0], strArray[1]) == 0) {
...
}
return 0;
}
对于接受字符串数组(不是指向字符串的指针数组,这是不同的)的函数:
void func(size_t rows, size_t cols, char strings[rows][cols])
{
char const *pointers[rows];
// Initialize each pointer to point to each row
for (size_t i = 0; i < rows; ++i)
pointers[i] = &strings[i][0];
// here you can manipulate the pointers, e.g. bubble sort them
printf("%s\n", pointers[0]);
}
调用这个函数:
int main()
{
char stuff[4][20] = { "cat", "dog", "snuffleupagus", "horse" };
func(4, 20, stuff);
}
专业提示:您可以计算数组维度而不是使用幻数:
#define LENGTH_OF(array) ( sizeof(array) / sizeof((array)[0]) )
char stuff[][20] = { "cat", "dog", "snuffleupagus", "horse" };
func( LENGTH_OF(stuff), LENGTH_OF(stuff[0]), stuff );
如评论中所述,请注意第二个维度(20
在我的例子中)。 C 允许用恰好该长度的字符串初始化 char 数组,在这种情况下,数组最终将不包含字符串(即它将包含非空终止的字符)。
我不知道我是否理解正确,但如果我理解正确,我将发布一个示例,您可以在其中传递 "strings" 的数组(在 C 中表示为 char 数组的数组).然后你可以比较数组中的前两个字符串
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* my_function(char *strings[]) {
char *ptrToString = NULL;
if (strcmp(strings[0],strings[1]) > 0) // Do you really mean '==1' here?
{
ptrToString = strings[1];
} else {
ptrToString = strings[0];
}
printf ("%s\n", ptrToString); // No need for '*', %s takes a pointer to char as argument
return ptrToString;
}
void main (void) {
char *a[] = {"dog", "cat"};
my_function(a);
}
备注: * 我将 "strcmp() == 1" 更改为检查 return 是否为正数。检查特定值是非常规的(可能与您的 C 实现不匹配)。在文档中,唯一的保证是 strcmp 将 return 正数、负数或零,但不是特定值。 http://linux.die.net/man/3/strcmp * 数组中必须至少有两个以 null 结尾的字符串,my_function 函数才能在没有段错误的情况下工作。
希望这能为您指明正确的方向。