c語言問題求教 關於指標變數問題

2021-12-25 02:11:09 字數 2441 閱讀 3661

1樓:郝在益

你不知道為什麼會這樣??其實,這個也很好理解的。

因為你的p是指向int型資料的,而int型資料在你的編譯器中佔用的是4個位元組,所以你的結果才是-2,而不是-8.

就拿你這個程式來說吧。p指向的是記憶體單元1638212。

但是p+1指向的確實1638212+4.而不是1638212+1.這是由你的資料型別所決定的。

如果你還不能理解的話,再給你舉一個例子你就能夠明白了。

如果你定義int a[10];

int *p = a;

如果這個時候p的值為1638212。

那麼也就是說a[0]的地址也是1638212。

那麼a[1]的地址就是1638212+4了。

而*(p+1)等價於p[1],也等價於a[1]的。

這個時候p+1是等於1638212+4的。

這樣的推理你能看懂不?

指標加1之後所指向的空間,並不是再原本指向的空間之後加1,而是加這個指標所指向的資料型別所佔有的空間字元數。

不信的話,你可以把int改為short試試,答案應該是-4.short只佔2個位元組。

看看下面的截圖吧。

2樓:匿名使用者

int所佔位元組是4個位元組,兩個指標相減跟兩個整形變數相減應該不同,指標相減的結果個人感覺是兩個指標所處地址所相差的位元組數,所以我想這塊我想2表示的是兩個int型變數所佔的位元組數即就是8,個人想法,僅供參考

3樓:匿名使用者

簡單點說吧

因為你的兩個指標都是指向int型資料 而int型資料的每個記憶體單元佔4個位元組,那麼就相當於你走路邁一步等於邁了四步!那麼你想想看,p和q的記憶體地址相差8,是不是q邁兩步就到了p呢?

4樓:

p和q是指標型別,不是整型,這兩個的運算式有區別的,比如p++,p的值增加的是一個整型數所佔的位元組數,而不是簡單的加1,在你的這個編譯系統,整型分配了4位嗎?所以q-p =-2?

5樓:學小平

這個與指標的型別有關,如果想要達到您的-8效果,您可以將p、q的指標型別強制裝換為char型再試一試。需要注意的是在使用指標偏移的時候,偏移的具體位元組數是與位元組的型別直接相關的。比如:

char *p;和int *q;的兩個指標分別+1的時候偏移的具體位元組數是不同的,p+1具體偏移一個位元組(一般是一個位元組,與具體編譯器對char的定義相關);q+1具體偏移的int型別個位元組(這與int型在編譯器中的定義相關)。

6樓:匿名使用者

p和q是指標,不是int變數,q-p =-2意味著p=q+2,即p是在q偏移兩位後的指標,具體偏移量由指標型別決定,這裡就是4

7樓:佘翰藻

指標相減結果是(相差的位元組數除以sizeof(指標指向的型別大小))

c語言中連結串列中的結構體指標變數問題。。。求教

8樓:

定義結構體指標變數時,只分配儲存指標型別需要的空間,比如listnode *p;這裡p有給他分配儲存指標的4個位元組的空間。

實際上你是要讓p指向一個結構體空間的,這個結構體空間在哪?

可以先定義listnode a;

然後 p=&a;

這時p指向一個之前申請分配過空間(編譯器設定過其地址和大小,在棧空間存放著了)。

現在我們要讓p指向一個臨時決定分配的空間(我們需要用來儲存輸入資訊或計算資訊),並讓p指向他,使得之後我們隨時通過p來訪問他。於是使用malloc先分配記憶體,並把malloc返回的地址賦值給p。在這裡,我們不能使用定義臨時結構體變數並讓p之前他(就如上面所說的p=&a),因為在子函式定義的變數,他們都是分配在子函式被呼叫時為其建立的棧空間,子函式退出時這些空間被釋放**,我們定義的變數生命結束,他們所在地址會被其他子函式被呼叫時建立棧空間所重用,那些地址很可能被新函式使用並修改所存資料。

這是我們不敢想象的,為了資料安全,必須使用malloc分配記憶體,因為malloc分配的記憶體是在堆空間分配,只有使用free後,其記憶體才會釋放,才能被其他地方重新分配。

9樓:匿名使用者

宣告結構體指標變數的時候,難道沒有為其分配記憶體嗎?

a:沒有,需要malloc

這和普通的指標分配沒有區別。

typedef struct stu

stu_t;

void main()

10樓:透明的沙漏

指標宣告的時候只是開闢了一個存放地址的記憶體,不管你這個指標是指向物件的還是char還是別的型別,指標宣告開闢的空間是一樣的,因為對於指標來說它存的只是地址,至於地址裡面的是char還是long對於宣告指標的記憶體是沒有關係的,所以如果指標要裝東西,需要malloc一個記憶體來存放char或者long型的東西

11樓:匿名使用者

在3kw的電爐盤上裝上5kw的爐絲可以嗎

C語言指標問題

當是陣列時,陣列名自然就是指標,所以不用 而如果是一個變數的話,那就需要 了 陣列名錶示的就是指標,就是第一元素的地址!所以不要加 是取地址 p的值只能是地址 char a 是變數不是地址 陣列a 的a是代表陣列的首地址 char a p a 說明 p是一個指標,指標說白了是一個地址。a表示的是一個...

c語言字元指標問題,一個c語言字元指標問題!

看了目前的回答,覺得還不完整。1 為什麼不能修改 其實不一定,不讓修改是一種保護。linux kernel前一陣子報告的嚴重問題的就是可以修改這個東西了。如果能夠修改,這個ch abcdefg 的語義就不正確了。因為,假設如果有下面的程式 ch abcdefg printf s n ch 如果按照正...

c語言問題輸出結果總是負數求教,C語言問題,輸出結果總是負數,求教

在你的switch語句最後都加一個default 看一下switch d switch u 如果出現error這行,說明你的fflush 沒有起作用,改正方法是在scanf 函式後,加一個getchar 如果沒有出現,把你的輸入資訊粘出來,即x d u都是什麼。再幫你看 這個問題有多種可能,不一而足...