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

2021-05-04 18:27:56 字數 3404 閱讀 2966

1樓:匿名使用者

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

資料型別

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

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

擴充套件資料

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

檔案輸入/輸出

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

標準輸入/輸出

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

1、stdin標準輸入

2、stdout標準輸出

3、stderr輸入輸出錯誤

2樓:匿名使用者

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

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

3樓:

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

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

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

4樓:匿名使用者

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

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

5樓:匿名使用者

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

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

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

6樓:匿名使用者

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

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

7樓:非常老

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

8樓:落單毛毛蟲

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

不知道你看懂了沒有?

9樓:匿名使用者

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

為什麼在c語言中,用scanf輸入字串時,不需加&

10樓:匿名使用者

舉例:char str[256];

scanf("%s",str);

其中str是陣列名,已經代表陣列的起始地址了,也可以這麼寫:

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

11樓:金色潛鳥

因為字串變數名在 scanf 語句裡 表示指標 (地址)

例如:char s[80];

scanf("%s",s); --- 這裡的s 已是地內址。

當然,寫成容 scanf("%s",&s[0] ); 也可以, &s[0] 是地址。

12樓:匿名使用者

這個問題現在告訴你也聽不明白。。。

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

13樓:匿名使用者

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

14樓:羶

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

c語言scanf函式問題執行scanf函式時任務框為什

你的c1,c2,c3沒有宣告定義 這樣是不可以用的 你的這個 問題比bai較高du深,涉及地址 偏移的問題zhi。你能否說一下,你dao想通過編寫這個回程式實答現什麼功能?我也看到已經有3個人回答了你的問題。但是,不知道你想做什麼,也不好下斷言,到底是簡單問題的低階錯誤,還是真的是進行地址操作?請說...

c語言中gets函式和是scanf函式有什麼區別呢

一 指代不同 1 scanf 是c語言中的一個輸入函式。2 gets 從標準輸入裝置讀字串函式。二 讀取方式不同 1 scanf 是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。2 gets 可以無限讀取,不會判斷上限,以回車結束讀取,所以程式設計師應該確保buffer的空間...

c語言中用scanf函式先輸入字串後輸入數值輸

include int main 你下面的 我給你改了一下,把 s d之間的空格去掉了,然後加了一個 a,通過兩次賦值,消除緩衝中回車的干擾 char buf 200 int i scanf s d buf,i 這樣應該可以,注意字串不能包含空格。scanf 函式是個阻塞函式,只有等待你輸完之後,才...