指向C中的数组赋值

时间:2013-01-09 04:28:33

标签: c pointers

我在尝试将指向数组的指针分配给另一个指向数组的指针时遇到问题,请告诉我代码中的问题在哪里:

void sort_strlen(char (*pt)[81]){

  char (*temp)[81];
  int i, j;

  for(i = 0; i < 10 && *(pt + i) != NULL; i++)
    for(j = i + 1; j < 10 && *(pt + j) != NULL; j++)
     if(strlen(*(pt + i)) < strlen(*(pt + j))){
       temp = *(pt + i);
       *(pt + i) = *(pt + j);
       *(pt + j) = temp;
     }

  for(i = 0; i < 10 && *(pt + i) != NULL; i++)
    puts(*(pt + i)); 

}

GCC在编译此函数时返回“分配不兼容类型”错误。问题一定是显而易见的,但我只是一个新手,我自己找不到问题。

2 个答案:

答案 0 :(得分:1)

这是导致错误的行吗?看起来像。 (你应该在你的问题中说明。)

*(pt + j) = temp;

pt属于char (*pt)[81]类型,temp属于同一类型。但是,当您执行pt时,请取消引用*(pt + j)。 (*取消引用指针,而是引用指针指向的变量。)

因此,*(pt + j)的类型为char[81]。这就是为它分配temp是错误的原因。

如果你知道自己在做什么,你可以通过类型转换来逃避这一点。但看起来这不是你所期望的,所以我不建议这样做。

答案 1 :(得分:0)

如果我们使用下标符号而不是*(pt+i)重写函数,则可能更容易看到问题。

void sort_strlen(char (*pt)[81]){

  char (*temp)[81];
  int i, j;

  for(i = 0; i < 10 && pt[i] != NULL; i++)
    for(j = i + 1; j < 10 && pt[j] != NULL; j++)
     if(strlen(pt[i]) < strlen(pt[j])){
       temp = pt[i];
       pt[i] = pt[j];
       pt[j] = temp;
     }

  for(i = 0; i < 10 && pt[i] != NULL; i++)
    puts(pt[i]); 

}

因此,当您尝试交换pt[i]pt[j]时,首先尝试分配char*char[81] pt[i]自动转移到char(*)[81]此处已转换为temp = pt[i];行中的pt[i]

此处应清楚类型不兼容。但通常,那只是一个警告并且“按预期工作”,因为pt[i]被转换为该字符串中第一个字节的地址,这也是数组&pt[i]的地址。如果通过指定pt + ipt[i] = pt[j];来调整右侧的类型,警告就会消失。

错误在下一行。在char*行中,您尝试将char[81]分配给pt[j] = temp;,并在char(*)[81]行中尝试将char[81]分配给pt[i] = ... {1}}。

数组不可分配,因此写

sort_strlen.c:13:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char *’
sort_strlen.c:14:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char (*)[81]’

始终是错误。不幸的是,gcc报告为

sort_strlen.c:13:18: error: array type 'char [81]' is not assignable
       *(pt + i) = *(pt + j);
       ~~~~~~~~~ ^
sort_strlen.c:14:18: error: array type 'char [81]' is not assignable            
       *(pt + j) = temp;
       ~~~~~~~~~ ^

而不是立即指向根本原因

char temp[81];
...
    strcpy(temp, pt[i]);
    strcpy(pt[i], pt[j]);
    strcpy(pt[j], temp);
那个铿锵声发出。 gcc报告的“不兼容类型”主要是不可修复的,因为右侧的 no 类型与赋值左侧的数组类型兼容。

  

我通过创建一个指针数组解决了这个问题。我想通过更改数组中的地址来直接对字符串进行排序。有人知道是否可能吗?最好的方法是什么?

这取决于你想做什么。您无法在不移动字符串的情况下更改字符串的地址,您可以使用

进行更改
char *strings[10];
for(int i = 0; i < 10; ++i) {
    strings[i] = pt[i];  // make it &pt[i][0] if you don't like the implicit conversion
}

如果你不想移动字符串,你最好创建一个指针数组

strings

并按字符串长度对char *temp; ... if (strlen(strings[i]) < strlen(strings[j])) { temp = strings[i]; strings[i] = strings[j]; strings[j] = temp; } 数组进行排序:

{{1}}