指向字串的指標printf輸出問題?

2022-11-26 20:55:07 字數 4298 閱讀 5992

1樓:聽不清啊

這裡的第三行是寫錯了。應該是。

printf("3 *str is:%c",*str);

才對的。%p格式符用來輸出變數在記憶體中的位址,是乙個十六進位製數 //常用的格式符有 %d是十進位制格式,%o是八進位制格式,%x是十六進位制格式。

因為str是char*,所以,*str是乙個字元。str是乙個字元陣列的首位址,*str就是這個字串的首字元。

2樓:匿名使用者

你的理解:首先總體評價一下,前半句對,後半句不對。

str是字元c的位址,c後面緊跟著hina,然後跟著乙個'\0',china和'\0'合在一起,稱作「字串」,即字串是以'\0'結尾的字串行。

當然了,字串的位址就是字串第乙個字元的位址,找到了第乙個字元,就找到了字串,所以前半句對了。

後半句和問題1整合在一起了,真相和你認識的可能相距甚遠,希望你能仔細理解,最好用**驗證。

1,*str 等價於str[0],是乙個char,而要輸出字串,需要%s格式,並且要求乙個char *指標做引數,你傳了乙個char,不崩潰就感謝比爾蓋茨吧。

你可以試試printf("%c", str);結果是輸出c

2,%s就是需要乙個位址,具體來說是乙個字串的位址。以%s這種格式,輸出的就是字串的整個內容。

3,指標的值就是位址,兩個解釋本質是一樣的,都是正確的。

指標字串輸出時候前面沒有* 為什麼

3樓:匿名使用者

char *s="abcd";

printf("%s",s); 對於"%s",函式要求字串變數指標,所以用s。

char *p;

int a = 5;

p = a;

printf("%d",*p); 對於"%d",函式要求乙個int型變數,*p是解除指標,取得int型值。

4樓:匿名使用者

printf("%s",s);用s的原因是,%s要求輸入乙個指標,或陣列名(也類似於指標);

如果換成要列印乙個字元:printf("%c",*s);這裡就需要輸入指標指向的字元而不是指標了;

指標的表示用s,指標指向的字元用*s或s[0]。

同理,printf("%d",*p);這是要輸出p指向的整型資料;printf("%d",p);則是要輸出指標本身的值(也就是a的位址)了。

5樓:匿名使用者

字串和字元或者變數是有所不同的。

%s是輸出乙個字串,以字串結束符當輸出的結束判斷s是指向乙個5byte空間,其中有4個字元和乙個結束符列印%s是需要乙個位址的,所以s不需要加*%d列印是需要乙個變數,而不是乙個位址,所以下面的需要加*來表示乙個變數,而不是位址。

p是位址,不是你所需要的。

你下面的那個*可以不加,但是列印的是p中所儲存的內容,而不是p指向的位址中的內容。

也就是說不加*列印出來的是p的內容,是乙個位址,也就是a的位址加*,列印的是p指向的記憶體空間的內容,也就是a位址中的資料,p中儲存的內容是a的位址。

這麼說明白了?

乙個變數有兩個資料,你知道吧。

乙個是變數的內容,也就是變數位址中儲存的資料乙個是變數的位址,這個是分配的記憶體空間的流水位址需要位址還是需要內容,這個看需要。

c語言——用指標解決字串問題——輸出乙個字串的子串

c語言 printf乙個指標(字串)的問題

6樓:雪豹出擊

你的有什麼問題,我按照你的編寫,編譯執行後兩個都沒有問題,請帖出你的錯誤,以便分析。

7樓:匿名使用者

c語言編譯器要求所有定義必須在函式頭上。

8樓:白了少

你是不是編譯器版本太低,變數的宣告只能放在其他運算前面。

c語言中變數指標輸出問題

9樓:匿名使用者

這和printf用%s的規則相關。

首先ps是乙個指向字元型資料的指標;printf用%s修飾輸出時需要提供乙個指標,這個指標指向的資料是字元型的,但printf將按照字串的規則來進行輸出,也就是輸出完這個指標指向的字元後,自動將指標加1,並判斷指向的字元是否為0,否則將輸出直至指向的資料為0為止,或者說找到字串結束標誌為止。

所以我們說,如果用%s修飾輸出是輸出字串,printf("%s",ps);,這句話要求提供乙個指標。

而要輸出單個字元的話應當用printf("%c",*ps);這時要求提供乙個字元型資料,用*ps表示ps指向的字元資料正好。

10樓:

值 位址。t 0030f8b0h 0030f8b1i 0030f8b2...

此時有char *ps="this is a book"; 由於ps是char型別指標變數,它的指標域只能儲存位址,我們知道"this is a book"是乙個字串陣列且拿到了首元素的位址就可以找到它整個字串,所以ps的指標域儲存了首字元的位址即t的位址0030f8b0,而格式輸出符%s,就是輸出字串之意,即從t開始輸出直至遇到\0符為止。

如果有printf("%c",*ps); 則取ps所指向的位址0030f8b0的值即字元t,換句說就是ps代表指標域即位址0030f8b0,再加上「*」就是取值的意思,合起來就是取位址0030f8b0的值即字元t.

11樓:匿名使用者

printf()函式是乙個可變引數的函式 編譯時它根本不知道它需要多少個引數(必須乙個以上) 和引數的型別 只能在執行時確定 如何確定? 第乙個引數灰常重要(char *)它定義了後面接著多少個引數 和引數型別,printf函式通過分析字串 是否含有 %c %s 這些內容 就可以知道後面的引數個數和型別。

%s 表示引數是char* 型別的 也就是乙個字串的首位址 對 它只得到乙個開始的位址 它沒有結束得到的位址 那printf如何確定字元在**結束(或者它有多少長?) 答案顯而易見 字串後面的0

當然你可以不傳入乙個位址。

printf("%s",10);

10不是乙個有效的位址 printf知道它是有效還是沒有效的嗎? 它不知道 它只能傻傻地去訪問10這個位址 最終程式崩潰退出。

printf("%s","ps);

傳遞給printf的是什麼? ps裡面的值! printf分析第乙個引數的知道它需要乙個char* 型別的引數。

把ps的值看成是位址 而去訪問ps的值表示的位址(ps裡如果是'a' 對應的65這個位址)

位址非法 當然報錯退出。

12樓:水星大使

不不不,你要知道,你前面用的是%s,那你後面用ps這個指標就可以整個字串了。。。你如果你用*ps輸出整個字串的內容,把前面的%s改成%c,乙個乙個輸出。。。

%s就是輸出格式為字串,後面就跟指標不要*指標。

13樓:匿名使用者

ps的值就是字串首位址,如果用*ps只表示第乙個字元。另外printf 、scanf等函式內部都支援字串,所以不必在費心考慮取位址還是取值問題。

14樓:匿名使用者

32位windows記憶體位址採用平坦結構,記憶體位址都是32位整數,而指標變數的實質就是記憶體位址。所以,不管哪一種型別的指標變數都是4個位元組大小。

15樓:匿名使用者

樓主理解的對,ps就是代表變數的位址 *ps代表ps指向的位址空間存放的值。

求救! 指標 printf輸出字串位址問題

16樓:匿名使用者

1全部color作為乙個指標,它的值是位址值。由於初始化為char *color =;等價於char *color = red";,color為指向"red",即其中首字母'r'的指標,值等於這個'r'的位址(color等於&color[0]等於&"red"[0])。

lz問題的答案是兩者都是。區別僅在於,在printf函式族中,%x把對應位置的值作為整數以16進製制輸出,%d把對應位置的值作為有符號整數以10進製輸出,結果看起來不同,實際意義是相同的。

不過按標準方式的話,在printf函式族中應該使用%p來輸出乙個指標型別的值。如果指標非null,結果一般和%x的類似(外加字首0x)。

17樓:網友

color得到的是這個陣列的道位址,而這陣列的首位址是放。

"r"的位址,所以&color[0]就是"r"的位址,也是首位址。

18樓:網友

兩個都是位址,乙個是16進製制,另乙個是10進製。

字串指標初始化,初始化字元指標

char s china 等價於char s s china 這是兩種賦初值的方法,第一種是在定義的時候賦初值,第二種是先定義,再在以後賦初值,它們的結果都上讓指標s指向首位址,也就是指向了內容的第乙個字母c 好好看看c語言程式設計那本書 char a china 等價於char a a china...

輸入字串,將字串中的字母所有字元按ASCII碼公升序排列後輸出

include int main include stdio.h include stdlib.h int cmp char const void a,const void b int main 這是用快速排序做的 這就是乙個排序問題嘛 c語言 輸入任意長度的字串,將該字串中的字元按ascii碼值公...

JS擷取指定字串到指定字串之間的內容

var str 123 asdadsadsa 456 str str.match 123 s 456 1 console.log str s 匹配任何非空白字元。匹配前面的子表示式零次或多次。match方法 語法 stringobject.match searchvalue stringobject...