https://i.stack.imgur.com/7Fgkp.jpg輸出)這是輸出影像的鏈接
我的代碼 ---->
#include <stdio.h>/span>
const int MAX = 5;
int main () {
char *names[] = {
"Zara Ali"。
"Hina Ali",
"Nuha Ali",
"Sara Ali"。
"Zara Ali"。
};
int i = 0;
for ( i = 0; i < MAX; i ) {
printf("Value of *names[%d] = %c char
"/span>, i, *names[i] )。
}
for ( i = 0; i < MAX; i ) {
printf("Value of *(names %d)=%d
", i, *(names i) )。
}
for ( i = 0; i < MAX; i ) {
printf("names[%d] 的值 = %d
", i, names[i] )。)
}
for ( i = 0; i < MAX; i ) {
printf("Value of *(names %d)=%s
", i, *(names i) )。
}
for ( i = 0; i < MAX; i ) {
printf("names[%d] 的值 = %s
", i, names[i] )。)
}
printf("names的值=%d", i, names[i]); }
",names )。
printf("names 1的值=%d",names ); printf("names 1的值=%d
",names 1 )。)
return 0。
當names和names[0]的值不一致時。
我在哪里可以正確地學習這個話題。
問題是 "我不知道......哪個變數在存盤哪個地址或值"。
uj5u.com熱心網友回復:
首先,下面這一行是錯誤的:
使用 列印指標的正確方法是使用 在大多數平臺上,向 正如在評論部分已經指出的,根據定義,撰寫 為什么 在你的圖片中,你似乎也在問為什么 uj5u.com熱心網友回復: 圖片會有幫助: 每個字串字頭( 每個 運算式 使用 這幾乎是你在C語言中唯一需要明確地將一個指標投向
標籤: 上一篇:將TupleTuple轉換(和反轉)為dict時的錯誤
下一篇:比較2個字串模板
printf()
printf("Value of names = %d
",names );%d格式指定器不是列印指標的正確方法。雖然它可能在大多數32位平臺上作業(在這些平臺上指標的大小通常為4),但它肯定不能在64位平臺上正常作業(在這些平臺上指標的大小通常為8)。
%p格式指定器,并通過將指標轉換為void*:printf( "名字的值 = %p
", (void*)names );void*的轉換是不必要的,所以你可能可以安全地省略它(即使ISO C正式要求轉換)。
names[i]等同于撰寫*(names i)。
names和names 1之間的區別是8,因為在這兩個運算式中,陣列names衰減到其第一個元素的指標,即到&names[0]。將一個指標增加1并不是將地址增加1,而是使其指向下一個元素。由于陣列names的每個元素都是一個指標,并且在你的平臺上似乎有一個8的大小(你似乎是在一個64位的平臺上,有64位的指標),當你將指標增加1時,地址增加了8。
*(names 0)和*(names 1)之間的差異是9。運算式*(names 0)等同于names[0],這是一個指向字串字面的指標"Zara Ali"。運算式*(names 1)等同于names[1],它是一個指向字串字面"Hina Ali"的指標。所以這兩個運算式都代表了字串字面的地址,也就是編譯器存盤某個字串字面的地址。編譯器在哪里存盤字串字面意義是由編譯器決定的,編譯器可能有不同的行為。然而,在這個案例中,編譯器似乎決定將兩個字串字面符號緊挨著存盤在記憶體中。字串"Zara Ali"的長度為9(包括空結尾字符),所以這就解釋了為什么地址的差異為9。
char * char *
--- ---
| 名稱[0] ----> |'Z'| 名稱[0] [0]
--- ---
| 名稱[1] ---- |'a'| 名稱[0] [1]
--- | ---
... | ...
| ---
|'i'| names[0] [7]
| ---
| 0 | names[0][8]。
| ---
|
| ---
--> |'H'| names[1] [0]
---
|'i'| names[1][1]
---
...
---
|'i'| names[1][7] 。
---
| 0 | names[1][8]
---
"Zara Ali", "Hina Ali", etc.)被存盤為記憶體中某個零端陣列的char(字串字頭的存盤方式是,它們在程式的生命周期內是可用的)。
names[i]存盤了每個字串字面的第一個字符的地址。names的型別是 "指向char的指標"(char **)1,并且評估為names陣列的第一個元素的地址 - 它等同于寫&names[0]。 運算式names[0]評估為"Zara Ali"字串字面的第一個字符的地址--這與寫&names[0][0]相同。
%p轉換指定符來列印指標值,而不是%d - %d期望其對應的引數具有int型別,而指標不是整數:printf( "value of names[%d] = %p
", i, (void *) names[i] ) 。
printf( "name的值=%p
", (void *) names ) 。
printf( "name 1的值=%p
", (void *) (names 1) ) 。
void *的時候。
除非它是
sizeof或單數& 運算子,或者除非它是一個字串字面,用于在宣告中初始化一個字符型別的陣列,否則一個 "N元素陣列T"型別的運算式將被轉換或 "衰減 "為一個 "指向T的指標 "型別的運算式,并且該運算式的值將是該陣列的第一個元素的地址。
變數 names被宣告為一個指向char的指標陣列(char *[])。 然而,當names出現在一個運算式中,并且它不是sizeof或單數&的運算元時,它被轉換為 "指向char的指標型別(char **)。
這就是為什么names是一個char *的陣列--每個字串字面本身就是一個陣列運算式("9-element array of char"),但是在這種情況下 "衰減 "為型別char *。
