printf和scanf函式為什麼要取位址符不用呢

2021-12-23 08:29:43 字數 5451 閱讀 6190

1樓:蓴灬叔

因為scanf的取得乙個字元,然後把這個字元存放到某一記憶體區域,所以要為它(字元)分配儲存空間。

printf的輸出乙個字元。

輸出的時候系統根據變數名(外部識別符號)在記憶體中找到與之相匹配的字元進行輸出操作。所以不用取位址符。

2樓:匿名使用者

printf是輸出,不用...因為你呼叫它時已經把要輸出的資料用形參的方式傳送給它了

scanf是輸入,形參可以說是局變數,函式執行完後就沒了,傳了位址讓它儲存到指定位址,這樣資料就可儲存了!

3樓:匿名使用者

因為scanf函式要返回數值給變數,而printf函式不用返回值給變數

4樓:匿名使用者

你用scanf輸入的時候,是要在函式內對變數值進行修改的。

而printf輸出的時候,只用到變數的值,不必在函式內改變變數的值。

如果是普通的函式引數傳遞,比如傳遞a,變數接收的方式是在函式內另外建立乙個變數,假設是b,然後把a的值傳遞給b就可以了。這樣如果對b的值進行修改,不影響原來的a。

傳位址則可以通過操作改變實參的值,比如把a的位址p1傳遞到函式中,函式中p2接收到了a的位址,因為p2指向的是a的位址,所以對p2位址指向的內容修改,就對原來的變數a修改了

為何在c語言中的scanf()中要用到取位址符,而printf()中卻不用?

5樓:

c語言開發時就這麼規定的,沒有太多的為什麼,當初人家發明c語言時說scanf需要加位址符,那咱們用的時候就得加,當初人家發明c語言時說scanf不需要加位址符,那咱們用的時候自然就不用加了。

6樓:匿名使用者

scanf意思是從鍵盤輸入資料,從鍵盤得到字元,放到某個變數裡,當然要它的位址了;printf意思是輸入某個變數的內容,只要知道變數名就行了。我個人認為是不是為了符合人的思考習慣。

另外,c語言開發時就這麼規定的,沒有太多的為什麼,當初人家發明c語言時說scanf需要加位址符,那咱們用的時候就得加,當初人家發明c語言時說scanf不需要加位址符,那咱們用的時候自然就不用加了。

7樓:匿名使用者

真正有興趣的話,可以看看能否找到printf和scanf的原始碼實現,這樣就清楚了。

c語言中為什麼printf輸出變數值的時候不要加位址符&,而scanf中卻要加上

8樓:聽不清啊

這是因為使用c語言定義的標準函式,c語言開發時就這麼規定的,沒有太多的為什麼(當初開發c語言的時候也可以不這麼寫)。

printf輸出變數值的時候不要加位址符&,而scanf中卻要加上。我們使用的時候記住它,就行了。

有時也有特例:陣列名本身就代表位址,就可以不用加取位址符&了(可以不加,加了也不錯)。

char s[100];

scanf("%s",&s);

9樓:未來需努力點綴

樓主你好

printf函式的目的是輸出 一般就是使用該變數的值 不需要改變這個變數的值

然而scanf函式的目的是輸入 是肯定會改變變數的值如果樓主學了指標 就應該知道:c語言在乙個函式中要改變變數的值 就需要使用指標 那麼對於乙個變數來說 就需要取位址(指標也就是位址)

希望樓主明白了哈

10樓:匿名使用者

輸出是變數的值,而賦值卻是需要位址的。

11樓:巛尢尢巛

根據我的經驗。我可以很負責的告訴你:話說輸出的printf ,肯定是已經定義賦了初始值,或者根據已知量還有前面的公式得出乙個具體的數或者字元,輸出時只需寫出名稱就可對應上相應資料,這相當於清點物品,只需說名稱即可。

而從鍵盤輸入的scanf 函式,是把該資料記錄下來,相當於把資料放在記憶體的某個位置,只是相當於搬來東西,指定存放的位置。手機打字辛苦,請樓主採納

c語言 scanf();為什麼要用取位址符

12樓:

因為scanf要往你的變數裡寫入數值,所以他必須知道那個變數的位址,至於變數裡存的是什麼值,他是不管的,反正他寫入之後就被覆蓋成新的值了

對比printf,他是要輸出變數裡的數值,他只管要那個值,至於位址在哪,他也無所謂

這就是寫和讀的本質性區別,寫只要位址,讀只要值

變數其實同時有位址和值兩個東西,我們一般用乙個變數,都是直接寫乙個名字,其實如果這個名字在賦值號右邊,就是代表值,如果在賦值號左邊,就是代表位址,寫出來一樣,意義是不一樣的,編譯器自動幫你選擇了正確的意義

變數名字寫在函式引數裡面時,和寫在賦值號右邊一樣,也是代表值,可是像scanf這種函式,他確實需要位址,編譯器只認識賦值號,不認識scanf,沒法自動選到正確的東西,這時就需要你手動加乙個取位址的符號&,明確告訴編譯器去選擇變數的位址給這個scanf來用

13樓:飛沛和妙珍

因為scanf這個函式要求的引數傳遞的是位址!!

函式原型:

int scanf(const char *format,...);其呼叫形式為:

scanf("《格式說明字串》",《變數位址》);變數位址要求有效,並且與格式說明的次序一致。

為什麼c語言scanf函式對字串不要加 取位址運算子&

14樓:匿名使用者

c語言的字串為陣列形式,而陣列的名稱可以表示其位址,故對字串輸入不需要加位址符。而單獨的字元、整型變數等的名稱不能直接表示位址,故需要加位址符。

資料型別

字串資料型別是建模在形式字串的想法上的資料型別。字串是幾乎在所有程式語言中可以實現的非常重要和有用的資料型別。

在某些語言中它們可作為基本型別獲得,在另一些語言中做為復合型別獲得。多數高階語言的語法允許通常用某種方式引用起來的字串來表示字串資料型別的例項;這種元字串叫做「文字」或「字串文字」。

擴充套件資料

字串c語言的字串其實就是以'\0'字元結尾的char型陣列,使用字元型並不需要引用庫,但是使用字串就需要c標準庫裡面的一些用於對字串進行操作的函式。它們不同於字元陣列。使用這些函式需要引用標頭檔案。

檔案輸入/輸出

在c語言中,輸入和輸出是經由標準庫中的一組函式來實現的。在ansi c中,這些函式被定義在標頭檔案;中。

標準輸入/輸出

有三個標準輸入/輸出是標準i/o庫預先定義的:

1、stdin標準輸入

2、stdout標準輸出

3、stderr輸入輸出錯誤

15樓:匿名使用者

字串名字就代表字串的首位址,因此不需要加&。

字串在儲存上類似字元陣列,所以它每一位的單個元素都是可以提取的,如s=「abcdefghij」,則s[1]=「b」,s[9]="j",而字串的零位正是它的長度,如s[0]=10。

在程式設計中,字串(string)為符號或數值的乙個連續序列,如符號串(一串字元)或二進位制數字串(一串二進位制數字)。

char greeting[6] = ;

依據陣列初始化規則,可以把上面的語句寫成以下語句:

char greeting = "hello";

擴充套件資料:

函式應用

1. 連線運算 concat(s1,s2,s3…sn) 相當於s1+s2+s3+…+sn。

例:concat(『11』,'aa』)='11aa』;

2. 求子串。 copy(s,i,i) 從字串s中擷取第i個字元開始後的長度為l的子串。

例:copy(『abdag』,2,3)=』bda』;

3. 刪除子串。過程 delete(s,i,l) 從字串s中刪除第i個字元開始後的長度為l的子串。

例:s:=』abcde』;delete(s,2,3);結果s:=』ae』;

4. 插入子串。 過程insert(s1,s2,i) 把s1插入到s2的第i個位置。

例:s:=abc;insert(『12』,s,2);結果s:=』a12bc』;

5. 求字串長度 length(s) 例:length(『12abc』)=5。

在asp中 求字串長度用 len(s)例: len("abc12")=5。

16樓:

c的輸入函式是scanf而非scanf。

c沒有字串變數,字串是用字元陣列處理的。陣列的特點是陣列名有雙重身份:既是陣列名又是這個字串第乙個字元的位址,也就是這個字串的首位址。

所以當有char a[10]的宣告後,scanf("%s",a)和scanf("%s",&a)都是合法的,前者a是指標身份,後者a是陣列名身份;無論早期的c還是現在的c都是認可的。

17樓:匿名使用者

因為scanf要獲取變數的位址才能把讀到的內容存放在這個變數裡

你說的字串是c風格字串,c風格字串變數本身就是這個字串的首位址,所以無需加&

18樓:匿名使用者

因為字串 名本身就是乙個指標。 如: char a[100]; a就是指標,指向陣列首位址。

而 int a; a 是整形變數,要用scanf來讀取資料放入 記憶體, 要訪問記憶體區域,要通過位址來訪問

所以要加上&, 通過&a來訪問記憶體區域。

19樓:匿名使用者

字串的變數名稱就是這個字串的首位址了

既然已經是位址了,就不用再取位址了

20樓:非常老

編譯器認為字串代表位址。

21樓:落單毛毛蟲

c語言的字串實際上是 字元陣列.

既然是陣列, 那麼陣列頭自然是乙個指標.

char str = ;

這個str實際上是乙個不可變的字元指標.

scanf的引數要求傳入指標. 之後按照格式化字串對指標指向的位址賦值..

str本身就是乙個指標了, 所以不需要&str,如果&str, 那麼得到是就是指標的指標,scanf並不只是對字串不加 取位址運算子.

例如 int arr = ;

scanf("%d", arr);

這裡對arr照樣不需要取位址運算子, 因為arr是陣列頭, 本身就是乙個指標.

上面的語句是對arr陣列的第乙個元素賦值, 就是arr[0];

當然也可以這麼寫.

scanf("%d", &arr[0]);

arr[0]是乙個值, 並非指標, 於是對其取位址.

對於字串也可以這麼寫.

char str[3] ;

scanf("%c", &str[0]);

這是對str的第乙個元素賦值也就是 str[0];

不知道你看懂了沒有?

22樓:匿名使用者

因為字串 char *str:本身就是指標變數

printf和scanf的用法,關於scanf函式和printf函式的用法與區別 菜鳥級提問!!

兩者完全不同,scanf是輸入函 數,printf是輸出函式,所以會經常同時出現。兩者也沒有可比性,需要弄清他們的概念。1.scanf 是c語言中的乙個輸入函式。函式 scanf 是從標準輸入流stdio 標準輸入裝置,一般指向鍵盤 中讀內容的通用子程式,可以說明的格式讀入多個字元,並儲存在對應位址...

c語言指標與scanf和printf的問題

我感覺b和d都正確,但b應該不提倡。不是宣告的情況下,p是值,p是位址。a a本身就是位址,a多此一舉,後邊的輸出應該是 p。b p與a 0 都是值,後邊的輸出也是值。c p是值,a 0 是位址,錯誤,後邊的應該是p.d p與a都是位址,後邊的是位址。注 printf 引數部分是值,scanf引數部...

c語言scanf函式格式問題

寒寒家 首先明確 1.對於 d的輸入,會忽略之前的空格 2.對於 c的輸入則不會忽略。3.對於 d的輸入,會被字元截斷,這也就是 輸入 10a20b 的時候,也不會錯的原因了。正確答案是a x1接收了10,y1接收了字元a,之後是一個空格,而輸入的是 d,所以會忽略空格,所以x2接收了20,y2接收...