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

時間 2021-08-16 11:05:24

1樓:匿名使用者

scanf(「格式控制字串」, 位址表列);

其中,格式控制字串的作用與printf函式相同,但不能顯示非格式字串,也就是不能顯示提示字串。位址表列中給出各變數的位址。位址是由位址運算子「&」後跟變數名組成的。

例如:&a、&b分別表示變數a和變數b的位址。

這個位址就是編譯系統在記憶體中給a、b變數分配的位址。在c語言中,使用了位址這個概念,這是與其它語言不同的。 應該把變數的值和變數的位址這兩個不同的概念區別開來。

變數的位址是c編譯系統分配的,使用者不必關心具體的位址是多少。

變數的位址和變數值的關係

在賦值表示式中給變數賦值,如:

a=567;

則,a為變數名,567是變數的值,&a是變數a的位址。

但在賦值號左邊是變數名,不能寫位址,而scanf函式在本質上也是給變數賦值,但要求寫變數的位址,如&a。這兩者在形式上是不同的。&是乙個取位址運算子,&a是乙個表示式,其功能是求變數的位址。

2樓:匿名使用者

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

函式原型:

int scanf(const char *format,...);

其呼叫形式為:

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

3樓:匿名使用者

因為scanf本來就是乙個函式

scanf本來就是乙個函式,用取位址後就能將接受的資料存在這個位址裡,在scanf函式外也能用。指標在函式內就是通過訪問所指向位址的值來進行改寫,並且能延續到函式外。

c語言取位址符有什麼用,為什麼scanf一定要用&

4樓:

取地來址符的作用是告訴系源統定義的變數的值存bai放在記憶體du空間的位址

,scanf函式zhi就根據這個位址值定址,然後dao從這個位址空間中取出我需要的資料值,對於變數來說,只能通過&a的方式獲取到該變數在記憶體中的位址,對於指標變數和陣列,就不需要這個取位址符了。**說明如下:

//變數

int a;

scanf("%d",&a);

//指標

int a,*p;

p=&a;

scanf("%d",p);

//陣列

int a[10];

for(int i=0;i<10;i++)scanf("%d",a+i);  //a+i<===>&a[i]

5樓:匿名使用者

取位址 就是把變數轉為指標, 起到傳位址呼叫函式的效果.

而c語言中函式

傳參有兩回種,傳值呼叫 和傳指標調答用.

傳值呼叫時, 被調函式中改變引數值不會影響主函式.

只有傳指標呼叫, 才可以將引數值回傳給主函式.

scanf中要根據輸入對引數賦值, 所以 必須傳指標呼叫.

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

6樓:匿名使用者

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

資料型別

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

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

擴充套件資料

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

檔案輸入/輸出

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

標準輸入/輸出

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

1、stdin標準輸入

2、stdout標準輸出

3、stderr輸入輸出錯誤

7樓:匿名使用者

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

字串在儲存上類似字元陣列,所以它每一位的單個元素都是可以提取的,如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。

8樓:

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

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

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

9樓:匿名使用者

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

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

10樓:匿名使用者

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

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

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

11樓:匿名使用者

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

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

12樓:非常老

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

13樓:落單毛毛蟲

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];

不知道你看懂了沒有?

14樓:匿名使用者

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

c語言為什麼這裡不用取位址符號&scanf("%d",p++);而要用p++

15樓:匿名使用者

p就是位址,懂嗎?p指向了陣列a,p的位址就是陣列a的位址,p++就指向了下乙個陣列中的位址

16樓:羶

p就是指標。指向陣列a的首位址。每次迴圈p++,指向陣列的下乙個元素的指標

為什麼在c語言中,字元型不能用scanf輸入,而是用getc

樓主你好,關於你問的這個問題在我初學c語言的時候也遇到過,不僅是乙個人遇到,這是很多初學者都會遇到的問題 當然,我不是說樓主大哥你是初學者 呵呵 這個問題曾經麻痺了很多人,開始我也是不知道是什麼原因,直到一次偶然的機會我才知道問題的所在 出錯原因如下 當你輸入資料後 回車,資料才被函式 scanf ...

c語言取餘什麼意思,C語言取餘什麼意思

一騎當後 c語言中,符號就是取餘數運算,也就是模運算 mod mod的含義為求餘。模運算在數論和程式設計中都有著廣泛的應用,從奇偶數的判別到素數的判別,從模冪運算到最大公約數的求法。設a,b是兩個整數,a b的結果就就是a b得到的餘數例如 5 3 2 商1餘2 9 4 1 商2餘1 3 7 3 商...

C語言什麼時候要用到strcat

對,說的好,你的方法會更簡單。strcat的用法就是可以多次拼接字串,這個和printf就有區別,printf是一次性的,如果你要在字串後面再加一段列印,那你就不得不將之前寫過的 再寫一便,但是用strcat之後,就不用一次次地規定要以什麼格式列印字串了 總之,各有各的好處,做了專案之後就知道了 還...