C 中,給指標賦值時,int P和

時間 2021-11-04 23:14:37

1樓:臺藻趙玥

都是定義了乙個指標變數,然後把a的位址複製給這個指標變數,效果基本是一樣的。

稍微的區別是,乙個是直接賦值,乙個是先定義,後賦值。區別在於,第二種先定義,後賦值的情況,如果定義與賦值間還有其他**,那麼p指向的位址是未知的,所以使用的話會有未知行為。

如果定義與賦值是連續的語句,那麼上述兩個內容就完全一樣了。

2樓:乘辰銘苑司

你說「可是前者訪問*p就相當於a,但卻是a的位址,這不是矛盾嗎?」,是因為你不明白*p的多義性,舉兩個例子你就知道了:int

*p;這是定義乙個指標變數,應該把他看作(int*)p;其中(int

*)跟int一樣,也看作是一種型別:指向實型數的指標型。

而對於int

*p=&a;

intb;

*p=b;在這裡,*p相當於(*p),「

*」是取內容運算子。

好好看書吧,這都是書上的細節部分,要想學得好,要靠記得牢。

3樓:卜夏蘭柴菁

一問題補充:還有

定義乙個指標要確定它指向資料的型別

比如int

*p;p指向的資料型別只能是int型;

那是為什麼呢?

因為程式執行執行某種操作的時候需要知道指標的型別比如int

a[10];

int*p=a;

現在p指向陣列的首位址

假設這個位址是0x00000000

那麼*p

=a[0]

那麼怎麼指向a[1]呢?執行p

=p+1後

*p=a[1]了

請注意p=p+1不是

0x00000000+1而是0x00000000+4(在32位的機器上)

為什麼是加4而不是加1

因為int型在32位機器上是佔四個位元組

所以指向下乙個陣列元素的位址就需要把位址移動四個位元組這就是指標需要型別的原因

如果指標是

char型別

那麼p=p+1位址就移動乙個位元組

我的表達能力不太好

不知道你能不能明白

二int

a;char

*p;a=4;/*輸出的值是否相等取決於此處的賦值範圍*/p=&a;

printf("%d\n",a);

printf("%d\n",*p);

如果a在-128~128間輸出都是相等的

超出範圍後就不一樣了.

這個就像我上面說的

如果是char型

那麼printf函式從指標開始讀取1個位元組輸出,如果是int型那麼printf函式從指標開始讀取四個位元組a=4在記憶體中儲存的為

0x04

0x00

0x00

0x00

(intel的cpu應該是這樣儲存的

不同的cpu是不一樣的好像

位址依次增加)

所以噹噹a在-128~128時

printf("%d\n",a);

printf("%d\n",*p);

都輸出0x04

(從指標開始讀取乙個位元組和4個位元組是一樣的)如果a大於128

比如在記憶體中儲存的為

0x04

0xff

0x00

0x00

這樣printf("%d\n",*p);

就只讀取了

0x04

,0xff被拋棄了

所以就不一樣了

好像是這個樣子的

三指標只存放乙個位址而已,難道不同資料型別的位址長度什麼的都不一樣嗎?

位址長度是一樣的

sizeof(int*)和

sizeof(char*)在32位機器都是4個位元組以上是我的回答

如果有什麼不正確的地方

還請指出謝謝

在c語言中,int *p,a; *p=&a,和p=&a有什麼區別?

4樓:天雨下凡

這樣問說明你對指標的概念還不清楚,以下兩種方式等價:

一、先宣告指標,再給指標賦值

int *p,a;

p=&a;

二、定義指標的同時給它賦值

int a,*p=&a; //這裡的*p可以解釋成int * p,int *表示p是指向int型變數的指標

5樓:匿名使用者

#include

int main()

{int *p,a=0xaa; //宣告 int指標

c語言指標問題:在定義指標時*p=a和p=a有區別嗎?

6樓:修者世界

當然有區別,區別很大,*p=a,就是給指標的表示的位址賦值,也就是賦值給指標指向的儲存單元;而p=a,則表示給指標賦值,也就是指標的位址變成了a。兩者乙個指明了具體值大小,乙個指明了具體位置。

7樓:

*p=a

是p所指向位址的內容是a(比如乙個數,或字元)p=a是p指向a(比如0x0001)這個位址囧了...問題看漏了..上面那位兄弟是對的...=_=

8樓:

在定義指標時,指標變數名前的*號是必須的,不能少,區別於普通變數, 說明當前變數是指標變數,而不是普通的變數。

對於你的問題,我舉例說明:

情形一:

int a[5]=;

int *p=a;//這是在定義指標變數p的同時就直接給它初始化,即把陣列a的首位址賦給它。

情形二:

int a[5]=;

int *p;//宣告指標變數p

p = a;

這裡的話是先宣告指標p,然後再對它初始話,等價於情形一,只是分開寫法而已。

9樓:lo廣

我覺得mcs51園地回答得有道理,比如*(a+1)=*(p+1)也論證了所說的a=p,而*p,你可以隨意賦值進去,比如*p=1,*p=3等等,看一些程式還是有區別的,真理還是屬於少數人啊

c++中如何給乙個int型別的變數賦值成乙個以零開頭的整數

10樓:幻の上帝

int型別只是整數,和數學中的定義一樣,不管字首有幾個0,值都相等。

在c/c++中,整版數字麵量權的字首0表示八進位制。所以int a;a = 0908;肯定編譯錯誤,因為9不是八進位制的合法數字。

按lz的要求,應該只是輸出樣式的問題。即使用int儲存,這種也很簡單,只用c/c++標準庫就可以實現,例如c風格的printf("%06d",a);或者利用c++標準i/o的cout<

====

[原創回答團]

11樓:千鋒教育

可以呼叫iomanip庫中

來的setfill和setw方法自來設定int型的前導0。

比如:#include

int main(int argc,char *ar**)執行後輸出結果是:03

12樓:匿名使用者

是int的話,是不能你那樣賦值的。

為什麼要0開頭的整數?

可以 std::string str("0908");

std::stringstream ost;

ost<>a;

13樓:80晴天

您好,這種定義是不合法的,你可以把a定義為字串,然後對a賦值0908

string a;

a = 0908";

你剛才說的學號問題使其十九字串實現的~

14樓:匿名使用者

以0開頭的整數是八進位制,你給的例子是不合法的,八進位制的數只能是0-7.

15樓:柯墨

據我所知是不可以的,除非你將a轉為string型別 然後再在前面加個『0』賦給另乙個string型別的b;

16樓:偷心的賊

a=0908是不行的,不過你可以輸出0908,這樣:

a=908;cout<<'0'<

17樓:匿名使用者

你可以使用c++提供的物件導向的設計能力,自己設計乙個類,用於實現你的想法,只要為其提供運算子方面的支援,就能靈活地使用了。

18樓:喜歡黑

0908根本就不是個整數啊,怎麼用int

c語言中int*p=a與int*p=&a有什麼區別???求大俠幫忙!!!

19樓:匿名使用者

區別很大。第乙個int *p = a;這是把a給乙個指標,一般a是指標或陣列,否則可能會造成很大錯誤。

int *p = &a;這是把a的位址給p,一般a可以是乙個整型變數。

20樓:匿名使用者

因為p為指標變數,它初始化的值只能為位址,例如:

int b[10],a;

int *p1=b,*p2=&a; //這兩種賦值都可以,注意,a,b都是位址,b是陣列名,為陣列的首位址,

若如下定義就是錯誤的:

int *p3=a;//a是簡單變數,不是位址,而是值,型別不匹配,所以錯了

21樓:步行者

int*p=a,首先a是乙個指標,然後定義乙個int型指標p,指向a

int*p=&a ,首先a是乙個數值(比如之前定義它 int a=100),那麼在定乙個指標p,指向a=100中a的記憶體位址

注意兩個式子放在一塊寫是錯誤的。不可能定義a為指標,又為數值

22樓:匿名使用者

int *p是定義乙個指標 對應的該是位址

int*p=&a 則a是個指標或陣列

int*p=&a 則a是個資料

23樓:匿名使用者

區別很大,第乙個是把a賦給指標變數p,a變數必須存放的是指標值;第二條語句是把a變更本身的記憶體位址拿出來,賦值給指標變數p。

24樓:

a的型別不一樣,第乙個要指標型別的int變數,第二個是普通變數

25樓:匿名使用者

第乙個a必須也是指標才能對吧,第二個指向了a的位址。

26樓:浦小雨漆娜

*p=&a;是將a的位址賦值給*p,結果會是乙個十六進製制的數。

第二個是讓p指向a的位址空間。*p的傎和a相等。

inta=2,*p;

*p=&a;

列印*p應該是乙個位址值,很長一串,

p=&a;

打*p印結果會是2;

c語言 如果我定義了乙個指標 int *p 和變數 int p, 他倆之間有什麼關係嗎?

27樓:匿名使用者

int *p;

int a=1;

p=&a;

p定義成了bai乙個整du型指zhi針,而a定義成了乙個初始值為1的整型變數。

dao指標是用來儲存內對應容型別的變數的位址的,所以p=&a;的意思是用指標p來儲存變數a的位址。

而如果同時定義int *p;int p;會發生編譯時錯誤,因為p重複定義了。

28樓:匿名使用者

同乙個作用域

內(比如同乙個**塊),不能重複定義變數,所以int *p;

int p;這樣的**是不能通過版編譯的

如果是不同的權作用域,那麼它倆並沒有什麼關係若是類似下面的定義:

int a;

int *p = &a;

表示p儲存了a的位址,或者說p指向a。

C語言指標,int p和int p,其中p是不是相同的變數?為啥號的位置不同呢

夢幻陽光 樓主對變數的概念還不是很瞭解 定義一個變數的時候,不管前面有多少東西,都是型別,只有最後面的是變數名 如 int a a為變數,改變數為int型 int b,int b 這兩個是一樣的,b為變數名,int 為修飾的型別,此處為int行的陣列 int c c為變數名,int 為修飾的型別,此...

c 中byte指標如何賦值

因為沒有給m explain申請記憶體,如果是指標,必須先申請記憶體。或者使用陣列,讓系統自動分配記憶體。可改為 static jbyte m explain malloc 2 sizeof jbyte int i 0 m explain i jbyte 0xff 這兩行始終執行不下去 m expl...

c 指標 區別,c 中別名 和指標 的區別

這是個運算優先順序的問題,由於 運算的優先順序大於 於是 abc 1先取出abc裡面的內容,再進行 1運算,結果就是abc內儲存的值加1 而 會改變運算順序,先算abc 1,這是將指標abc向下移了一位,再作 運算,也就是取出了指標abc所指位置下乙個位置裡面儲存的內容,這個運算一般只在陣列中進行,...