2014-09-28 63 views
-1

我無法弄清楚數組和指針的工作以及它們是如何相互關聯的區別。下面的數組和指針示例的邏輯是什麼?

代碼:

char str[]="banti is a nice girl"; 
    char *ptr=str+6; 
    printf("%s",ptr) 

輸出:is a nice girl

  1. 我沒有在我的printf語句中使用非關聯化操作,
    爲什麼它給我數組的內容,而不是地址?

  2. 當我寫char*ptr=str[6]我得到Error: cannot convert char to char* -
    這個錯誤是什麼意思?

  3. 難道我們需要把​​放在一個數組地址上,但是我們不需要放在str+6的位置嗎?如果是這樣,它背後的邏輯是什麼?

+1

此代碼無法編譯,您在第一行中缺少'*'。 – 2014-09-28 08:50:36

+0

編輯該程序。 – Rishu 2014-09-28 08:51:50

+1

'str [6]'是'char',而不是'char *'。 'str'表示'str'的​​第一個元素的地址已經被評估爲一個指針。 – BLUEPIXY 2014-09-28 08:52:05

回答

1

當使用代碼如下面

char str[]="banti is a nice girl"; 
printf("%s",str); 

則數組STR被轉換爲指針類型char *

的其第一元件所以上面的代碼等同於

char str[]="banti is a nice girl"; 
char *ptr=str; 
printf("%s",ptr); 

當函數printf進程格式說明符%s時,它將相應的參數視爲類型爲char *的指針nd輸出指針指向的所有字符,直到遇到終止零。

所以在這個代碼剪斷

char str[]="banti is a nice girl"; 
char *ptr=str + 6; 
printf("%s",ptr); 

您只需將指針右移6個字符,printf函數開始輸出字符從str + 6

0

它正在推進由6 str基地址現在將指向is a nice girl

試試這個:

main() 
{ 

     char str[]="banti is a nice girl"; 
     char *ptr=&str[6]; 
     printf("%s",ptr); 
} 

嘗試打印:

printf("%d",str[6]); // return first character ascii value 
    printf("\n%d",(str+6)); // return the address 
    printf("\n%d",&str[6]); // return the address 

​​和(str+6)均表示地址,但str[6]表示字符串的第一個字符。

+0

但是爲什麼它會發生。請再次閱讀上面的問題。 – Rishu 2014-09-28 08:54:37

+0

你應該分配該位置的地址。 – Rustam 2014-09-28 09:07:22

+0

ASCII可能不是目標字符集/編碼。數組'str'是一個字節大小的代碼單元序列。哪一個字符集的編碼是未指定的。這就像是Windows-1252或equiv或Unicode/UTF-8。 – 2014-09-28 14:38:19

1

在您的代碼中,str的類型爲char[21]。也就是說,一個數組包含banti is a nice girl中的所有字符加上nul終結符,\0。現在,在C和C++中,數組很容易衰減到指向其第一個元素的指針。這發生在這個表達式:

str + 6 

這裏,str可以被理解爲&str[0]。將該值增加6,可得到指向strstr[6]的地址)中的第7個位置的指針,即iisptr被初始化爲保存這個指針的值。當您將ptr傳遞到printf時,它將打印從該位置開始的字符串,直到nul終止符。

Now, I didn't use dereferencing operator in my printf statement, why it is giving me the context of the array, and not the address?

因爲你告訴printf要傳遞一個指針到一個空終止字符串,讓它可以打印出字符串。這就是"%s"的意思。 printf知道如何打印一個nul結尾的字符串。它打印字符,直到找到nul終止符\0

Why it gives error if I write char*ptr=str[6]; Error: cannot convert char to char*;

因爲str[6]char,你不能從一個char初始化char*。這是編譯器錯誤告訴你的。

+0

也許一個小的參考一些更多的解釋:http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html – cageman 2014-09-28 08:58:23

+0

可以說int str [2,3,4,5,6 ,7,8]; int * ptr = str + 4;現在要打印值「6」,我會寫入printf(「%d」,* ptr)而不是printf(「%d」,ptr)上面的問題。爲什麼這裏的語法有所不同,爲什麼我的輸出不是6 7 8,因爲它發生在我上面的問題中? – Rishu 2014-09-28 09:05:09

+0

@Rishab不同的是'printf'假定你使用'%s'並傳遞'char *'時傳遞一個nul結尾的字符串。它打印字符,直到找到一個nul終止符。 – juanchopanza 2014-09-28 09:11:14

0

的錯誤你是在

Why it gives error if I write char*ptr=str[6]; Error: cannot convert char to char*; 
接收

那是因爲你正在做這樣的事情

char* str = *(str + 6); 

你也知道STR [6]將被評估,以*(STR + 6),其等於i。這i您試圖在字符指針STR存儲..

0

我幾乎可以肯定,你根本不明白數組和指針在C和C++。

數組如何在C和C++中工作?

char str[]="banti is a nice girl"; 

該行創建一個字符數組。

['b','a','n','t','i',' ','i','s',' ','a',' ','n','i','c','e',' ','g','i','r','l','\0'] 
^
str 

陣是你必須[]之間是什麼,它的存儲在內存中的某個地方;
您可以通過指針str訪問它。

str+6意味着指針str6元素移動到它指向的元素之後。

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
{'b','a','n','t','i',' ','i','s',' ','a',' ','n','i','c','e',' ','g','i','r','l','\0'} 
^     ^
str     str+6 

str[6]意味着*(str+6),這意味着得到str+6的價值

strchar*是,str+6char*,但*(str+6)char,等於'i';
char不能隱式轉換爲char*

什麼是printf,當你給它的格式爲字符串%s

它期望你給它char*指針指向char);
它使的char*你給(讓我們命名副本copy),並執行類似副本:

while((*copy)!='\0'){ 
    //print out *copy; 
    ++copy; 
} 

所以,它打印char從後陣char,直至符合'\0'