A. c語言 scanf();為什麼要用取地址符
scanf(「格式控制字元串」, 地址表列);
其中,格式控制字元串的作用與printf函數相同,但不能顯示非格式字元串,也就是不能顯示提示字元串。地址表列中給出各變數的地址。地址是由地址運算符「&」後跟變數名組成的。
例如:&a、&b分別表示變數a和變數b的地址。
這個地址就是編譯系統在內存中給a、b變數分配的地址。在C語言中,使用了地址這個概念,這是與其它語言不同的。 應該把變數的值和變數的地址這兩個不同的概念區別開來。變數的地址是C編譯系統分配的,用戶不必關心具體的地址是多少。
變數的地址和變數值的關系
在賦值表達式中給變數賦值,如:
a=567;
則,a為變數名,567是變數的值,&a是變數a的地址。
但在賦值號左邊是變數名,不能寫地址,而scanf函數在本質上也是給變數賦值,但要求寫變數的地址,如&a。這兩者在形式上是不同的。&是一個取地址運算符,&a是一個表達式,其功能是求變數的地址。
B. & C語言取址符怎麼讀
第一個printf
是將i的值輸出,
即為10
第二個printf是將i的地址輸出,此地址在你申明這個變數的時候
系統自動分配
p指向i的地址
。
在
申明語句中,*只表示你申明的變數是指針型,不是指向運算符(不同的地方含義不同)此語句等價於
int
*p;
p=&i;
若在賦值語句中,那麼*就表示指向運算。
C. C語言中地址符究竟是什麼
地址符& 就是獲得一個變數/常量/函數的內存地址,沒有別的含義。
scanf中,使用地址符,是因為scanf需要的是指針變數(因此指針變數不需要地址符),而普通變數需要通過地址符轉譯為指針使用。
charc,*p;
c='a';
p=&c;//這是地址符的「真諦」
scanf("%c",&c);
scanf("%c",p);
注意兩個scanf語句都是正確的。
D. C語言關於取地址符的問題。
你好!!
1.地址就像你家的地址一樣,指針變數存放的就是你家的地址,要想到你家,必須找到存放你家地址的變數(針對指針而言),那就是指針。
2.要是變數是整型不是字元串數組名,那就的帶取地址符!!!
3.& 是取地址符的,(但還有位於運算),要是需要變數的地址就要加取地址符。
不理解,我們在交流!!!
E. C語言關於取值和取址
1、首先打開Visual C++,點擊左上角「文件」菜單按鈕,並點擊「新建」按鈕。在彈出的窗口中首先選擇「文件」選項卡,在左側列表中選取「C++ Source File」項。
F. C語言中關於取地址符號「&
是的 他就是這個意思 這樣的後果就是在函數中更改a的值 在調用函數中也會改變
G. &怎麼讀 c語言的取地址運算符。就是7那個鍵的那個符號。
1.scanf函數的一般形式
scanf(格式控制,地址表列)
int scanf(char *format[,argument,...]);
「格式控制」的含義同printf函數;「地址表列」是由若干個地址組成的表列,可以是變數的地址,或字元串首地址。
scanf()函數返回成功賦值的數據項數,出錯時則返回EOF。
例題 scanf函數輸入數據。
#include<stdio.h>
void main(){
int a,b,c;
printf("input a,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
格式字元 說明
%a 讀入一個浮點值(僅C99有效)
%A 同上
%c 讀入一個字元
%d 讀入十進制整數
%i 讀入十進制,八進制,十六進制整數
%o 讀入八進制整數
%x 讀入十六進制整數
%X 同上
%c 讀入一個字元
%s 讀入一個字元串
%f 讀入一個浮點數
%F 同上
%e 同上
%E 同上
%g 同上
%G 同上
%p 讀入一個指針
%u 讀入一個無符號十進制整數
%n 至此已讀入值的等價字元數
%[] 掃描字元集合
%% 讀%符號
附加格式說明字元表修飾符 說明L/l 長度修飾符 輸入"長"數據
h 長度修飾符 輸入"短"數據
W 整型常數 指定輸入數據所佔寬度
* 星號 空讀一個數據
hh,ll同上h,l但僅對C99有效。
(B) 空白字元空白字元會使scanf()函數在讀操作中略去輸入中的一個或多個空白字元,空白符可以是space,tab,newline等等,直到第一個非空白符出現為止。(C) 非空白字元一個非空白字元會使scanf()函數在讀入時剔除掉與這個非空白字元相同的字元。
註:scanf()控制串知識就介紹到這里(應該比較齊全了^_^),如有遺漏下次補上。下面將結合實際常式,一一闡述.三、 scanf()函數的控制串的使用例1.#include "stdio.h"
int main(void)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);return 0;
} 運行時按如下方式輸入三個值:3□4□5 ↙(輸入a,b,c的值)3,4,5 (printf輸出的a,b,c的值) (1) &a、&b、&c中的&是地址運算符,分別獲得這三個變數的內存地址。
(2) "%d%d%d"是按十進值格式輸入三個數值。輸入時,在兩個數據之間可以用一個或多個空格、tab鍵、回車鍵分隔。
以下是合法輸入方式:
① 3□□4□□□□5↙
② 3↙
4□5↙
③ 3(tab鍵)4↙
5↙
例2.#include "stdio.h"
int main(void)
{
int a,b,c;scanf("%d,%d,%d",&a,&b,&c);
printf("%d,%d,%d\n",a,b,c);return 0;
} 運行時按如下方式輸入三個值:3,4,5 ↙(輸入a,b,c的值)或者3,□4,□5 ↙(輸入a,b,c的值)3,□□□4,□5 ↙(輸入a,b,c的值)
......
都是合法的,但是","一定要跟在數字後面,如:
3□,4,□5 ↙就非法了,程序出錯。(解決方法與原因後面講)再如:1、sacnf()中的變數必須使用地址。 int a, b;
scanf("%d%d",a,b); //錯誤
scanf("%d%d",&a,&b);2、scanf()的格式控制串可以使用其它非空白字元,但在輸入時必須輸入這些字元。例:
scanf("%d,%d",&a,&b);
輸入: 3,4 ↙(逗號與"%d,%d"中的逗號對應)
scanf("a=%d,b=%d",&a,&b);
輸入: a=3,b=4 ↙("a=","b=",逗號與"%d,%d"中的"a=","b="及逗號對應)
3、在用"%c"輸入時,空格和「轉義字元」均作為有效字元。例:
scanf("%c%c%c",&c1,&c2,&c3);
輸入:a□b□c↙
結果:a→c1,□→c2,b→c3 (其餘被丟棄)
scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。問題二:scanf()函數不能正確接受有空格的字元串?如: I love you!
#include <stdio.h>
int main()
{
char str[80];
scanf("%s",str);
printf("%s",str); return 0;
}輸入:I live you!
輸出:I scanf()函數接收輸入數據時,遇以下情況結束一個數據的輸入:(不是結束該scanf函數,scanf函數僅在每一個數據域均有數據,並按回車後結束)。
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。所以,上述程序並不能達到預期目的,scanf()掃描到"I"後面的空格就認為對str的賦值結束,並忽略後面的"love you!".這里要注意是"love you!"還在鍵盤緩沖區(關於這個問題,網上我所見的說法都是如此,但是,我經過調試發現,其實這時緩沖區字元串首尾指針已經相等了,也就是說緩沖區清空了,scanf()函數應該只是掃描stdin流,這個殘存信息是在stdin中)。我們改動一下上面的程序來驗證一下:#include <stdio.h>
int main()
{
char str[80];
char str1[80];
char str2[80];
scanf("%s",str);/*此處輸入:I love you! */
printf("%s",str);
sleep(5);/*這里等待5秒,告訴你程序運行到什麼地方*/
scanf("%s",str1);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */
scanf("%s",str2);/*這兩句無需你再輸入,是對鍵盤盤緩沖區再掃描 */
printf("\n%s",str1);
printf("\n%s",str2);
return 0;
}輸入:I love you!
輸出:I
love
you!好了,原因知道了,那麼scanf()函數能不能完成這個任務?回答是:能!別忘了scanf()函數還有一個 %[] 格式控制符(如果對%[]不了解的請查看本文的上篇),請看下面的程序:#include "stdio.h"
int main()
{
char string[50];
/*scanf("%s",string);不能接收空格符*/
scanf("%[^\n]",string);
printf("%s\n",string);
return 0;
}問題三:鍵盤緩沖區殘余信息問題
#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
scanf("%c",&c);
printf("a=%d c=%c\n",a,c);
/*printf("c=%d\n",c);*/
}while(c!='N');
} scanf("%c",&c);這句不能正常接收字元,什麼原因呢?我們用printf("c=%d\n",c);將C用int表示出來,啟用printf("c=%d\n",c);這一句,看看scanf()函數賦給C到底是什麼,結果是 c=10 ,ASCII值為10是什麼?換行即\n.對了,我們每擊打一下"Enter"鍵,向鍵盤緩沖區發去一個「回車」(\r),一個「換行"(\n),在這里\r被scanf()函數處理掉了(姑且這么認為吧^_^),而\n被scanf()函數「錯誤」地賦給了c.解決辦法:可以在兩個scanf()函數之後加個fflush(stdin);,還有加getch(); getchar();也可以,但是要視具體scanf()語句加那個,這里就不分析了,讀者自己去摸索吧。但是加fflush(stdin);不管什麼情況都可行。函數名: fflush
功 能: 清除一個流
用 法: int fflush(FILE *stream);#include <stdio.h>
int main()
{
int a;
char c; do
{
scanf("%d",&a);
fflush(stdin);
scanf("%c",&c);
fflush(stdin);
printf("a=%d c=%c\n",a,c); }while(c!='N');
} 這里再給一個用「空格符」來處理緩沖區殘余信息的示例:運行出錯的程序:#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf("%c",&j);/*這里%前沒有空格*/
}
}使用了空格控制符後:#include <stdio.h>
int main()
{
int i;
char j;
for(i = 0;i < 10;i++)
{
scanf(" %c",&j);/*注意這里%前有個空格*/
}
} 可以運行看看兩個程序有什麼不同。問題四 如何處理scanf()函數誤輸入造成程序死鎖或出錯?#include <stdio.h>
int main()
{
int a,b,c; /*計算a+b*/scanf("%d,%d",&a,&b);
c=a+b;
printf("%d+%d=%d",a,b,c);
}如上程序,如果正確輸入a,b的值,那麼沒什麼問題,但是,你不能保證使用者每一次都能正確輸入,一旦輸入了錯誤的類型,你的程序不是死鎖,就是得到一個錯誤的結果,呵呵,這可能所有人都遇到過的問題吧?解決方法:scanf()函數執行成功時的返回值是成功讀取的變數數,也就是說,你這個scanf()函數有幾個變數,如果scanf()函數全部正常讀取,它就返回幾。但這里還要注意另一個問題,如果輸入了非法數據,鍵盤緩沖區就可能還個有殘余信息問題。正確的常式:#include <stdio.h>
int main()
{
int a,b,c; /*計算a+b*/while(scanf("%d,%d",&a,&b)!=2)fflush(stdin);
c=a+b;
printf("%d+%d=%d",a,b,c);
自己網上學習啊,不要看都不看就問問題
H. c語言取地址符有什麼用,為什麼scanf一定要用&
取地址符的作用是告訴系統定義的變數的值存放在內存空間的地址,scanf函數就根據這個地址值定址,然後從這個地址空間中取出我需要的數據值,對於變數來說,只能通過&a的方式獲取到該變數在內存中的地址,對於指針變數和數組,就不需要這個取地址符了。代碼說明如下:
//變數
inta;
scanf("%d",&a);
//指針
inta,*p;
p=&a;
scanf("%d",p);
//數組
inta[10];
for(inti=0;i<10;i++)
scanf("%d",a+i);//a+i<===>&a[i]
I. C語言中取地址的符號都有哪些
&也有一些本身就是地址的,比如數組名那些
*p那是指針~~!
不同的,那個不是取地址,是取那地址裡面的內容。
J. c語言中取地址符和*有什麼區別
區別如下:
(1)兩者根本意義不同。*是指針的意思,而&是去地址的意思,這兩個相輔相成。
(2)用法不同。高級的c語言都是動態開辟內存,是使用malloc和free,這時就不用&了,因為取引用都是對於棧上的數據,在數據結構中,都是在堆上開辟數據容量。
(3)語言規則不同,變數類型加*就是一個指向該變數類型的指針,通俗點說,指針就是可以通過地址修改和獲取該變數的值,而&符號只是獲取該變數的地址!
指針中的「取地址符」
(10)c語言中取地址符按什麼鍵擴展閱讀:
引用的聲明符放置在變數名的前面,和*操作符的用法一樣。
引用聲明完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,且不能再把該引用名作為其他變數名的別名。ra=1; 等價於 a=1;
聲明一個引用,不是新定義了一個變數,它只表示該引用名是目標變數名的一個別名,它本身不是一種數據類型,因此引用本身不佔存儲單元,系統也不給引用分配存儲單元。
故:對引用求地址,就是對目標變數求地址。&ra與&a相等。
#include<iostream>using namespace std;int main()
{ int m[10]={1,2,3,4,5,6,7,8,9,10}; int (&n)[10]=m; for(int i=0;i<10;i++) cout<<m[i]<<' ' ;
cout<<endl; for( i=0;i<10;i++) cout<<n[i]<<' ' ; cout<<endl; return 0;}
例如:
int*pointer;//建立一個指針
int*&p1=pointer;/*
正確,編譯系統把"int*"看成一體,把"&p1"看成一體,即建立指針pointer的引用,就是給指針pointer起別名p1。
int&*p2=pointer;//錯誤,這就變成了引用的指針。