c語言的賦值問題,C語言指標的賦值問題

2021-10-07 19:11:05 字數 3199 閱讀 3041

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語言指標問題,行指標的賦值與取值

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語言指標問題

這個演算法最後的時候 p和q都是指向a的,在最後這個時候a的結構是,q之前的是所有的除了版 之外權 的字元。q之後的都是原來a裡面的資料,對於這個時刻是髒資料。最後把q指向的那個位置賦值為 0可以在遍歷a的時候,不遍歷到髒資料,而這個時候p正好指向的就是 0,所以 q p 迴圈結束條件是 p 0,因...

C語言的指標問題

這兩個程式都只有乙個主函式,當你需要呼叫函式的時候,就涉及到引數傳遞的問題了。這時如果你要在呼叫的函式中直接改變實參的值的話,引數傳遞就必須傳遞位址,也就是要用到指標了。如果你只是傳遞引數值的話,在呼叫的函式中,會為形參分配臨時的儲存空間,把實參的值傳遞給它,也就是說傳遞的只是值。可能你是剛開始接觸...