簡體   English   中英

C中的char * s []和char s [] [20]有什么區別?

[英]what's the difference between char *s[] and char s[][20] in C?

檢查這第一個代碼,如果我寫的是char *tracks[]而不是char tracks[][80] ,它似乎仍然可以正常工作。

#include <stdio.h>
#include <string.h>

char tracks[][80] = { "I left my heart in Harvard Med School",
        "Newark, Newark - a wonderful town", "Dancing with a Dork",
        "From here to maternity", "The girl from Iwo Jima", };

void find_track(char search_for[]) {    //'char *search_for' is equivalent.
    int i;
    for (i = 0; i < 5; i++) {
        if (strstr(tracks[i], search_for))
            printf("Track %i(Line %i):'%s'\n", i, i + 1, tracks[i]);
    }
}

int main() {
    char search_for[80];
    printf("Search for: ");
    scanf("%79s", search_for);  //fgets(search_for,80,stdin);
    find_track(search_for);
    return 0;
}

但是請檢查第二個代碼,如果我嘗試使用char juices[][20]而不是char *juices[] ,則編譯器給出錯誤信息,我想知道為什么嗎?

#include <stdio.h>
#include <string.h>

void print_reverse(char *s) {
    size_t len = strlen(s);
    char *t = s + len - 1;
    while (t >= s) {
        printf("%c", *t);
        t = t - 1; //pointer arithmetic
    }
    puts("");
}

int main() {
    char *juices[] = { "dragonfruit", "waterberry", "sharonfruit", "uglifruit",
            "rumberry", "kiwifruit", "mulberry", "strawberry", "blueberry",
            "blackberry", "starfruit" };

    char *a;

    puts(juices[6]);
    print_reverse(juices[7]);
    a = juices[2];
    juices[2] = juices[8];
    juices[8] = a;
    puts(juices[8]);
    print_reverse(juices[(18 + 7) / 5]);

    puts(juices[2]);
    print_reverse(juices[9]);
    juices[1] = juices[3];
    puts(juices[10]);
    print_reverse(juices[1]);

    return 0;
}

這是很奇怪的,因為如果您檢查下面的第三個代碼,則將出現錯誤,因為無法更新指向字符串文字的指針。 如果事情是這樣的,那么在第二個代碼中char *juices[]是指向字符串文字的指針數組,然后juices[2]是指向"sharonfruit"的指針,如何對其進行更新?

#include <stdio.h>

int main()
{

char *cards = "JQK";  //you should use char cards[]="JQK";
char a_card = cards[2];

cards[2] = cards[1];
cards[1] = cards[0];
cards[0] = cards[2];
cards[2] = cards[1];
cards[1] = a_card;

puts(cards);

return 0;

}
char tracks[][80] = { "I left my heart in Harvard Med School",
    "Newark, Newark - a wonderful town", "Dancing with a Dork",
    "From here to maternity", "The girl from Iwo Jima", };

創建一個char數組,換句話說,創建一個二維char數組,並使用每個字符串初始化每個索引。 字符串數由編譯器在編譯時確定,每個字符串的最大大小為80。

char *tracks[] = { "I left my heart in Harvard Med School",
    "Newark, Newark - a wonderful town", "Dancing with a Dork",
    "From here to maternity", "The girl from Iwo Jima", };

聲明一個char指針數組。 每個指針指向每個字符串文字。 指針的數量由編譯器在編譯時確定。

字符串文字是不可變的 ,表示不能更改。

在使用tracks前兩個程序中,第一個版本( char tracks[][80] )和第二個版本( char* tracks[] )在不更改字符串且未分配數組的情況下起作用。

在使用juices的后兩個程序中,第一個版本可以工作( char* juices[] ),因為可以更改指針,即,它們指向的位置可以更改,但是第二個版本可以使用char juices[][80]char juices[][80] )不是因為您分配了數組。 請記住, 數組是不可分配的

要解決此問題,可以使用string.h庫中的strcpy函數互換存儲在char juices[][80]的字符串。 請注意,如果要嘗試執行此操作,則需要為變量a分配內存。

在C語言中,“最外面的”數組(即first [] )會自動類型轉換為指向第一個元素的指針。

從而,

char tracks[][80] 

聲明一個指向char數組(長度為80)的指針。

然而

char *tracks[]

顯然是一組字符指針,這是不同的。 編譯器知道這一點,不會讓您這樣做。

同樣,這些東西在內存中也有所不同:數組化合物在內存中絕對是線性的,指針數組可能包含指向內存中任何地方的指針。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM