2013-01-11 74 views
-5

誰能告訴我,以下聲明是正確與否:指向字符串的概念在C

char (*p)[10]; 

p是一個指向10個字符的字符串。

我做了如下的程序:

/*PROGRAM*/ 

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

void xstrcpy(char (**)[], const char (**)[]); 
void main() 
{ 
    const char (*xsource)[10]="SUPERB"; 

    char (*xtarget)[10]; 

    printf("\n\n*************PART1*************\n\n"); 
    printf("%s\n",xsource); 

    printf("\n\n*************PART2*************\n\n"); 

    xtarget=xsource; 

    printf("%s\n",xtarget); 

    printf("\n\n*************PART3*************\n\n"); 


    xstrcpy(xtarget,xsource); 
    puts(xtarget); 

} 

void xstrcpy(char (**p)[],const char (**q)[]) 
{ 

     p=q; 
} 

計劃的目的是將一個字符串從另一個複製。

在此先感謝。

+2

http://cdecl.org的字符數組是你的朋友。 –

回答

1

p是一個指向10個字符的字符串的指針。

這是一個指向一個char陣列長度-10,其可以或可以不被解釋爲字符串的...

0

炭(* P)[10];

解釋此代碼的一個好方法是從右向左讀取,實際上,這是在編譯中理解此代碼的真正方法。

所以這個過程是:[10] - >這是一個有10個元素的數組。 (*p)[10] - >這是一個指向與10個任何類型的元件的陣列。 char (*p)[10] - >這是一個指向具有10個char元素的數組的指針。

這裏我們可以發現如果我們沒有括號,我們首先會遇到p[10],最終結果會有些不同:p是一個數組而不是指針。

您可以閱讀Dan Sales寫的一篇文章:const T vs. T const。它將幫助你理解這類問題,儘管它專注於C++。

對於你的程序,我只能說做一個實驗併發布你的結果,首先感謝你^ 0^~~如果你讓我猜,我想我會說這是行不通的,因爲指針的類型是錯誤。

2

要了解如何確定C變量類型,你應該學會的「左右規則」,這是在這裏解釋:http://ieng9.ucsd.edu/~cs30x/rt_lt.rule.html

使用規則,並按照ieng9文章的風格在這裏是你如何通過確定類型在您的示例:

1. Find identifier      char (*p)[10]; 
              ^
    "p is a" 

2. Move right (stop at right paren)  char (*p)[10]; 
               ^
3. Stop at right paren and move left char (*p)[10]; 
              ^
    "p is a pointer to" 

4. Stop at left paren and move right char (*p)[10]; 
               ^
    "p is a pointer to array (size 10) of" 

5. Out of symbols so move left   char (*p)[10]; 
             ^
    "p is a pointer to array (size 10) of char" 

或者換言之,p是一個指針,指向大小10.