2016-05-13 115 views
0

嗯,我不會用指針工作很多,但現在我感到困惑。我試圖創建字符串指針數組(在這個例子中只有2個指針)。字符串上的指針C數組

char str[120]; 
    char* st[2]; 
    int i=1; 
    while (fgets(str,120,f)) { 

    printf("%s",str); 
    st[i]=&str; 

    i++; 
    if (i==3) 
     break; 
} 
for (i=1;i<=2;i++) { 
    puts(st[i]); 
} 

警告:從兼容的指針類型[默認啓用]

分配,以便你能幫助我瞭解有一個字符串指針,這一切情況。請

+1

'ST [I]'是'字符*',或一個指向角色的指針。 '&str'是一個char(*)[120]',或者一個指向120個字符數組的指針。注意那些是不同的。 – immibis

+0

所以我需要改變&str str,當我這樣做時,我得到了這個:12 ! ! –

+0

'int i = 0;'..'st [i] = strdup( str);''if(i == 2)'..'for(i = 0; i <2; i ++){' – BLUEPIXY

回答

2

數組始終使用從0開始的索引。

例如:

int my_arr[] = { 10, 11, 12, 13, 14, 15 }; 

意味着數組my_arr具有從索引0開始直到6-1 6個元件(5)。所以,一個N元素數組的索引從0到N-1。另外請注意,my_arr本身也是一個指向數組的指針。

限定INT指針:

int *iPtr = my_arr; // note that we do not use &my_arr here. my_arr is already a pointer to the array it defined. 

int *iPtr; 
iPtr= my_arr; 

它們是相同的。

Array and Pointer in Memory

在圖中,框所代表的價值和它們的地址除了框寫入。

當您使用變量i作爲索引遍歷數組時。你基本上做間接如下:

i = 0 
my_arr[i] 

是相同

my_arr[0] 

是相同

*(my_arr + 0) 

是一樣的(替代命名my_arr框的值)

*(20014000+0) 

*運算符讓你的VA在此示例中的地址0x20014000處爲10

上述操作也一樣

iPtr[0] or *(iPtr+0) 

看看命名iPtr盒子,它也包含相同的值0x20014000

現在,讓我們定義一個指針數組:

int *myptr_arr[3]; 
int varA = 25; 
int varB = 34; 
int varC = 67; 

myptr_arr[0] = &varA; // note that varA is not a pointer, to get its address use & 
myptr_arr[1] = &varB; // note that varB is not a pointer, to get its address use & 
myptr_arr[2] = &varC; // note that varC is not a pointer, to get its address use & 

enter image description here

再次,當你寫myptr_arr[0]將其轉換爲

*(myptr_arr + 0) 

*(20152000 + 0) 

這將讓你0x20162000即價值框名爲[0] =地址varA。現在要獲取此地址的值,您需要使用*運算符對其進行解引用。

*myptr_arr[0] 

其是相同* (*(myptr_arr + 0)) 其是相同*(0x20162000) 這是框varA

的值,請參見:Example usage of pointers