簡體   English   中英

如何在 C 中使用字符串和指針?

[英]How to work with strings and pointers in C?

  1. 為什么是p+=*string[2]-*string[1]而不是p+=string[2]-string[1] (沒有星號)?

  2. res[0]=*p; 它的值是'c'為什么? 為什么p在單詞字母上移動而*string[1]在單詞之間移動而不是字母?

    #####我已經編輯了代碼.........did "char* p= string;" 可以用“char p=*string[0];”代替嗎?

代碼的輸出是

C

 int main (void)
 {
   char* strings[]={"abcdb","bbb","dddd"};
   char*p=*strings;
   char res[2];
   p+=*string[2]-*string[1];
   res[0]=*p;
   p+=3;
   res[1]=*p;
   printf("%s\n",res);
   return 0;   
 }

該程序具有未定義的行為。

我們不會考慮到有一個錯字和替代標識strings有有時被用來標識string 讓我們假設代碼片段中的任何地方都使用了標識符strings

在這份聲明中

char*p=*strings;

數組的第一個元素被分配給指針。 數組的第一個元素是指向字符串文字"abc"的第一個字符的指針。 所以 p 指向字符串文字的字符'a'

在這份聲明中

p += *strings[2] - *strings[1];

strings[2]是具有char *類型的數組的第三個元素,其值是字符串文字"dddd"的第一個字符的地址。 取消引用此指針*strings[2]您將獲得此字符串文字的第一個字符'd'

strings[1]是具有char *類型的數組的第二個元素,其值是字符串文字"bbb"的第一個字符的地址。 取消引用此指針*strings[1]您將獲得此字符串文字的第一個字符,即 `'b'

字符'd''b' (for example in ASCII the code of character內碼之差'b' (for example in ASCII the code of character “b” is 98 while the code of “d” is 98 while the code of為100)等於2。

所以這個說法

p += *strings[2]-*strings[1];

將指針增加 2。起初它指向第一個字符串文字"abc"字符'a' ,增加 2 后它現在指向同一字符串文字"abc"字符'c'

因此在這個聲明中

res[0] = *p;

字符'c'被分配給res[0]

在此聲明之后

p+=3;

p的值變得無效,因為它現在指向字符串文字 "abc" 之外,並且編譯器沒有必要將字符串文字"bbb"恰好放在字符串文字"abc"

所以在下一條語句中取消引用這個指針

res[1]=*p;

導致未定義的行為。

根據 C 標准

如果結果指向數組對象的最后一個元素,則不應將其用作被評估的一元 * 運算符的操作數

它只是以這樣一種方式發生,編譯器將字符串文字一個接一個地放在內存中。 雖然這不是由標准保證的。

所以如果在聲明之后

res[1]=*p;

res[1] 不包含字符'\\0'那么下一個語句

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

也有未定義的行為。

首先是你的程序中沒有像string定義的東西,所以你的語句應該是p+=*strings[2]-*strings[1]

您的兩個問題的答案都是Dereferencing a pointer 您需要了解指針如何在字符串上工作。 請檢查此鏈接

暫無
暫無

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

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