在下面的代碼中,我們從 strdup(source) 中獲取一個指標,并將其存盤在一個名為 target 的指標中。現在,當我們使用指標列印字串時,我們不會在指標的開頭添加 *:為什么會這樣?正如我所研究的,每當我們想取消參考任何使用 *pointer_name 的指標時。如果我們在下面的代碼中添加 *,我們會得到一個錯誤。我是初學者,所以請用簡單的話回答。
#include<stdio.h>
#include<string.h>
int main()
{
char source[] = "Programming";
char* target = strdup(source);
printf("%s\n",target);
return 0;
}
uj5u.com熱心網友回復:
printf需要一個 char 指標來代替說明%s符。
https://en.cppreference.com/w/c/io/fprintf
uj5u.com熱心網友回復:
strdup()回傳 a ,char*因此回傳char*. 保存指向s陣列中第一個字符的指標。期望是 a ,所以沒有理由對;做任何事情 把它傳給.targettargetcharprintf("%s", string)stringchar*targetprintf()
如果你取消參考target,你會得到一個char(P在這種情況下)。printf()然后會抱怨您提供了一個字符而不是一個字串(指向字符的指標)。更糟糕的是,程式可以編譯,然后printf()會嘗試在地址P( 0x50) 處列印字串,這可能會導致不希望的行為。
當使用陣列時——字串是陣列的一種型別——你很少想取消對陣列的參考。
uj5u.com熱心網友回復:
char* target = strdup(source);
printf("%s\n",target);
為什么我們不在上面的代碼中使用 *target?
解釋很簡單,正如之前的答案中已經說明的那樣:目標具有型別 char 指標,這正是 printf() 在上述呼叫中想要的。
現在, printf() 有點復雜,因為它的語意并不簡單——基本上它在第一個引數之后接受零個或多個引數,任何型別(可能應用提升)。但是如果我們再次使用 strdup() ,可能會更簡單:
char* target2 = strdup(target);
在這里,如果您撰寫了 strdup(*target),編譯器可能會警告您傳遞的是 char 而不是指向 char 的指標。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/431675.html
