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。