1樓:匿名使用者
上面的說法中, 都存在錯誤或不足.
1.首先 c=a+b 的意義是把 a 和 b 這兩個變數的內容 5 和 6 相加得 11, 再把 11 這個結果值傳送至 變數 c 所在的儲存單元儲存起來;
而不是你想像的: 將 a 和 b 這兩個變數組合為一個變數作為 c, 或者複製一份變數組合再作為 c.
當你用int a=5, b=6, c; /* 你問題中的 int a=5;b=6; a=5 後面的分號應改為逗號, 否則 b 就沒有被定義 */
定義了 a, b, c 這三個變數時, 它們都只是在記憶體中分別佔用了同樣大小的儲存空間,
比如: int 型佔用2個位元組的話, 它們就都只是分別佔用了2個位元組, 3個變數也不一定相鄰,
用這2個位元組, 它們就可以表示 [-32768, +32767] 區間裡的 65536 個不同的數值.
其次, 在 c 語言中, 變數 c 必須先定義, 後使用. (但在 c# 或某些語言中, 定義可以放在使用的後面),
你如果先這樣定義了: int c; c 也只是佔用了一個空間(任何普通變數都只是佔用一個空間, 陣列等除外).
2.a+b=11 是不行的, a+b 是一個加法表示式, 其結果不是左值(詳見後述), 是不能作為賦值運算子的左運算元的,因為賦值運算子的左運算元必須是一個左值.
3.左值和左運算元的區別:
左值--------對應了一個儲存空間, 可以放在賦值運算子的左邊作為左運算元, 一般的變數都是左值.
左運算元----雙目運算子左邊的運算元, 不一定對應一個儲存空間, 可以是變數,也可以不是變數.
4."表示式不可以作為左值" 的說法是錯誤的, 左值 和 左運算元 是兩個不同的概念
int x, *px = &x;
*px = 5; /* *px 是一個表示式, 其結果是一個左值, 而且作了賦值運算的左運算元 */
printf("%d\n",x); /* 輸出 5 */
2樓:河蟹春風吹滿地
c一定要在第一行 int中定義,應該寫成
int a=5,b=6,c;
c=a+b;
注意中間應該用逗號,當定義a,b,c後,記憶體就自動分給他們每個變數1個空間
記憶體的分配不因賦值的方式改變而改變
3樓:匿名使用者
c語言中規定
表示式不可以作為左值
a,b跟+是分別存放在空間中
做加運算時,會把a放入暫存器中,b放入加法器中並不是a+b也開啟一個空間,所以a+b=11是錯誤的
4樓:匿名使用者
你的理解有誤,c與a和b不在同一段空間(因為它們並不是聯合體的成員).
2.a+b=11這樣的表示式也是不正確的,因為賦值操作符('=')的左值應該是個物件名(變數),而不能是表示式。
c語言指標的賦值問題
5樓:大野瘦子
指標在用要注意初始化,例如:
int *p;
p為指標,地址是未知的,如果直接賦值
*p=a;這樣編譯可以通過,但是會產生警告,p的地址是隨機分配的,這樣對未知的地址賦值很危險,可能會覆蓋掉某些重要資料,所以避免這種危險,在定義指標時注意初始化,也就是賦值。
可以int *p=&a;
或者int *p;
p=&a;
然後再對p進行操作
有錯。注意大小寫,還有
int a=9;
int *p;
p=&a;//這個是指標指向a
*p=8;
這樣就對了。
指標的賦值
int *p;
int a;
int b[1];
p = &a;
p = b;
指標的賦值,“=”的左運算元能夠是*p,也能夠是p。
當“=”的左運算元是*p時,改變的是p所指向的地址存放的資料;
當“=”的左運算元是p時,改變的是p所指向的地址。
陣列的變數名b表示該陣列的首地址,因此p=b;也是正確的
同型別的指標賦值:
int val1 = 18,val2 = 19;
int *p1,*p2;
p1 = &val1;
p2 = &val2;
p1 = p2; //注意啦,p1指向了val2,而沒有指向val1
備註:字串與指標的初始化和賦值
初始化:
char *cp = "abcdefg"; //這個初始化過程,是將指標cp指向字串的首地址,而並非傳遞字串的值。由於,在c語言裡面,沒有總體處理一個字串的機制
賦值:cp = "abcdefg";
*cp=”abcdefg” ;//錯誤!字串常量傳遞的是它的首地址,不能夠通過*cp改動該字串的值,由於該字串為常量,而它僅僅是簡單的將指標指向該字串常量。
6樓:林聲飄揚
有錯注意:用指標變數前,必須對指標變數賦值如:int i, *p1;
p1=&i;
再如:int a, b;
int *p1, *p2;
*p1=10; *p2=100;
但指標變數未賦值,即指標指向未知地址,這樣是錯誤的因此:絕對不能對未賦值的指標變數作“指向”運算。
int a=9,b;
int *p=&b;//必須加上這一句
*p=a;
*p=8;
這樣就不會產生錯誤
7樓:匿名使用者
注意大小寫!還有
int a=9;
int *p;
p=&a;//這個是指標指向a
*p=8;
這樣就對了。
8樓:七先生是遊戲鬼才
這個還是比較複雜的,你可以學習一下
9樓:匿名使用者
p=&a//把a的地址給指標p
10樓:匿名使用者
語法上沒錯,但可能出現警告,破壞程式其他資料
11樓:渾濃強浩然
p就是一個指標,他指向一個地址,而&p就是p剛才所指向的具體地址,*p是p指向地址裡面的東西。也就是值。*p=&a的意思是把a的地址給了*p,這樣的話p就指向
(指向a的地址)的地址。對指標賦值必須是int*p=null;或者int
*p;p=null。
C語言 關於賦值錯誤的問題,C語言賦值問題
注意看這裡 a b b a 1 2 m 正確的應該是 a b b a 1 2 m 如果只有乙個 的話,這是乙個賦值表示式,賦值表示式的左運算元怎麼可能還是乙個表示式呢?if a b b a 1 n a b b a 1 2 m 這句語句錯了,我不知道你是不是想寫成 a b b a 1 2 m 變成 這...
C語言指標問題,行指標的賦值與取值
1.p a 1可以。表示p指向陣列a的第1行。2.p a表示p指向陣列a的第0行。3.p a.則 p是陣列a的首地址,這個地址型別是int 4.可以定義成 p 4 但不能p a。因為它們型別不一致。5 p的值與型別與a 0 相等。 菜刀剁菜鳥 1.正確 2.p a是表示p指向陣列a的第0行 p指a ...
C語言,指標問題,C語言,指標問題
指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的 型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。讓我們分別說明。先宣告幾個指標放著做例子 例一 1 int ptr 2 char...