【问题标题】:Parsing pointer parameter in C在C中解析指针参数
【发布时间】:2013-12-17 23:30:25
【问题描述】:

此代码采用 5 个字符串并按升序对它们进行排序。

 void swap (char data[5][255], int i, int j) {
     char temp[255];
     strcpy(temp,data[i]);
     strcpy(data[i],data[j]);
     strcpy(data[j],temp);
 }

 void sort (char data[5][255], int n) {
     // * : first address contact
     int i, j;
     for(i = 0; i < n-1; i++)
         for( j = i+1; j > 0; j--)
             if(strcmp(data[j-1],data[j])>0)
             {
                 printf("%s",data[j-1]);
                 swap(data, j-1, j);
             }
 }

 int main() {
     char strings[5][255];
     char comp[255];
     int i, n;
     n = sizeof(strings)/sizeof(comp);
     printf("Enter 5 strings, max 255 chars each:\n");
     for(i=0; i < n; i++)
         scanf("%s",strings[i]);
     sort(strings, n);
     printf("Sorted data:\n");
     for(i=0; i < n-1; i++)
         printf("%s, ",strings[i]);
     printf("%s.\n",strings[i]);
     return 0;
 }

除此之外,我怎样才能解析我的静态数组 string[5][255] 以使用指针来运行? 例如,我尝试过,

void sort ( char **data, int i ) { ... }

但它会抛出这样的错误。

incompatible pointer types passing 'char [5][255]' to parameter of type 'char **'

有什么我可以使用指针解析我的数组的吗?

由于数组被解析为函数它的第一个地址(指针),我认为函数会接受这些表达式。请给我一些建议以便理解。

【问题讨论】:

标签: c arrays sorting pointers


【解决方案1】:

你必须传递的参数不是指向指针char**的指针,而是指向char数组char(*)[255]的指针

void sort (char (*data)[255], int n)

传递数组时,可以省略第一维的大小

void sort (char data[][255], int n)

相当于char(*)[255]

char** 是一个指针,它指向另一个指针。而char(*)[255] 是一个指针,它指向一个数组

【讨论】:

  • 感谢奥拉夫先生,但我不明白为什么这是不可能的。是不是因为数组保存优先不把解析参数分配成无限的方式?
  • 不可能,因为它们是不同的类型。请查看更新后的答案。
  • 非常感谢Olaf先生,总结一下,函数不能指向指针,但可以指向任何其他类型(如数组),对吧?
  • 您可以使用指向指针的指针,如@Jekyll 所示。但是,在您的情况下,您只是没有一个,而是一个指向数组的指针。
  • 不是char *[255],而是char (*)[255]。它们非常不同。
【解决方案2】:

您必须了解:char **datachar (*data)[255] 之间的区别

这是两种不同的类型,因为内存分配可能不同:

当使用char **data 时,指针运算可能无法正常工作,这意味着数据可能会分散在整个内存中

当使用char (*data)[255] 时,指针算法可以完美运行,因为数组的所有元素都彼此相邻

【讨论】:

  • 谢谢达维尔先生。然后,如果我通过使用像'malloc'这样的内存分配来分配数组,那么是否可以解析为像'sort(char **data,int n)'这样的双指向函数?因为我记得我曾尝试将动态数组解析为指针。
  • @Sogo 是的,如果您将在堆上分配字符串,那么您的 sort(char **data, int n) 将起作用
  • char *data[255] 不是char (*data)[255]
【解决方案3】:

正如我在评论中写给你的 char[][] 不会衰减到 char** 但它会衰减到 char(*)[] (在你的情况下是 char (*data)[255] ),因为第一个元素在不是指针的指针中衰减“指向指针的指针”,而是指向 255 个字符的数组的指针。如果您执行以下操作(c++),则可以使用 char** 指针:

char **array = new char *[N];

for(int i = 0; i<N; i++)
    array[i] = new char[N];

或使用 malloc (c)。

正如@newact 建议的那样,区分它们很重要

char *data[255] -&gt; char *[255]data = => "数据是一个包含 255 个指向 char 的指针的数组" 和

char (*data)[255] -&gt; char [255](*data) => "数据是一个指向 255 个字符数组的指针"

【讨论】:

  • 我明白了,杰基尔先生!谢谢。这对我帮助很大!
  • char*[] 是一个指针数组。和char (*)[255]很不一样
  • @newacct 更正了描述中 char(*)[] 中的 char*[] :)。
【解决方案4】:

尝试进行以下更改:

void swap ( char *data, int i, int j)

*(data + index1*255 + index2)

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 1970-01-01
    • 2019-01-24
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多