C語言指標的問題,C語言指標的一個問題

2022-06-01 22:52:08 字數 6117 閱讀 1105

1樓:匿名使用者

(1) 第一個框裡的**

short* temp = *p1; 等價於下面的兩條語句:

short* temp;

temp = *p1;

所以,後面

*p2=temp;

和上面是一致的, 沒錯.

(2)第二個框裡的**

沒錯, 指標就一個該指向指標, 但是你這裡賦值一個值.

這種做法是錯誤的, 不過對c語言來說, "錯的"的意思是"不能保證正確", 你是可以"碰巧正確的".

根據(1)理由 *p = *temp 是錯的.

或者你也可以認為這裡是對的, 而 short* temp才是錯的,反正就是這兩個地方不一致.

(3)第三個框裡的**

這個是完全正確的.

2樓:匿名使用者

第一題,第二題:

temp是個指標,temp=*p1之後,temp=61(即'a')了。而*temp表明temp指向的地址上面的值(即地址61上面的值,而實際上61是個數值,不是地址)

第三題:

這個是正確處理方法。你需要交換的是個整數,不是地址,所以定義temp時定義為整數型別

3樓:匿名使用者

short *temp=*p1;是把『a』賦值給了temp,而不是把地址賦值給temp。

關於c語言的指標問題(指標的地址+1問題) 10

4樓:小p精神

我來給你寫個例子,你參考一下

int *p, *q,*s;

int a[3] = ;

p = a; //將a的首地址賦值給p 那麼p指向的值應該是a[0]的值2

printf("a[0] = %d; *p = %d \n", a[0], *p);

q = &a[0] + 1; //將a[0]的地址向右偏移一位就等於a[1]的地址 a[1] = 8那麼*q應該等於8

s = q + 1; //將q指標向右偏移一位,相當於把a[1]的地址向右偏移一位,即a[2]的地址指向的值是25

//列印驗證一下

printf("a[0] = %d; *q = %d ;a[1] = %d *s = %d\n", a[0], *q,a[1],*s);

5樓:

輸出的四行**分別是:

a的值,

a的地址+1的地址值(並非a的地址,因為你的p值已經+1了),*p表示的是p指向地址的內容值;

*q表示a的地址+17地址上內容的值.

a的地址+1的值,是指向下一個地址,偏移量為a的型別長度

c語言 printf一個指標(字串)的問題

6樓:雪豹出擊

你的有什麼問題,我按照你的編寫,編譯執行後兩個都沒有問題,請帖出你的錯誤,以便分析。

7樓:匿名使用者

c語言編譯器要求所有定義必須在函式頭上

8樓:白了少

你是不是編譯器版本太低,變數的宣告只能放在其他運算前面

關於c語言指標釋放的問題

9樓:

這段話中有好幾個錯誤。

1. 如果有int a, int *b = &a, 這時執行free(b) 一定引起記憶體錯誤。

free只能使用在動態分配的記憶體上,不能用在堆疊或靜態資料上。

類似 int a,或 static int a,這樣的變數定義,是在編譯時已經確定了記憶體位置。

動態分配是在執行時,從堆中臨時分配的記憶體塊(用malloc,或new)。這些記憶體塊需要用 free(malloc)或delete(new)釋放;

2. 變數名實際是記憶體地址的代稱,這句也不完全對

在程式中,變數名代表了「這個地址上的數值」,只有對變數使用&操作,才能得到變數的地址

3. free(b)應該釋放了b這個指標變數

如果指標變數存放了一個動態得到的地址,free(b)釋放的是變數b的數值(不是變數b的地址),由於變數b的數值是一個動態分配得到的地址,所以free釋放的是動態地址。

c語言指標的賦值問題

10樓:大野瘦子

指標在用要注意初始化,例如:

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改動該字串的值,由於該字串為常量,而它僅僅是簡單的將指標指向該字串常量。

11樓:林聲飄揚

有錯注意:用指標變數前,必須對指標變數賦值如: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;

這樣就不會產生錯誤

12樓:匿名使用者

注意大小寫!還有

int a=9;

int *p;

p=&a;//這個是指標指向a

*p=8;

這樣就對了。

13樓:七先生是遊戲鬼才

這個還是比較複雜的,你可以學習一下

14樓:匿名使用者

p=&a//把a的地址給指標p

15樓:匿名使用者

語法上沒錯,但可能出現警告,破壞程式其他資料

16樓:渾濃強浩然

p就是一個指標,他指向一個地址,而&p就是p剛才所指向的具體地址,*p是p指向地址裡面的東西。也就是值。*p=&a的意思是把a的地址給了*p,這樣的話p就指向

(指向a的地址)的地址。對指標賦值必須是int*p=null;或者int

*p;p=null。

c語言中,定義一個指標的時候為這個指標開闢儲存空間嗎?

17樓:海天盛筵

int*p:第一級指標,表示p點所在地址是一個100int型別的值,p被宣告為一個指向整數的指標,並且為這個指標分配了儲存空間。但在這種情況下,它是一個隨機數,我們稱之為指向一個不確定的記憶體地址。

當使用者說「direct*p=5」時,在一個不可預知的記憶體地址上寫入一個整數5。這是不允許的,並可能導致程式崩潰。

p = & a;然後,將現有變數a的地址寫入指標p,我們說指向a的指標可以通過變數p對變數a進行正常操作。

擴充套件資料:

指標:指標的表示法是地址,核心是指向關係的指標,操作符「*」的作用是根據關係訪問所指向的物件。如果版本與b有指向關係,則a為b的地址,「*a」表示通過該指向關係間接訪問b。

如果b的值是一個指標,它指向c,bc地址,間接訪問,cb「*」如果c是整數,真實的,或結構,如型別變數或陣列元素對於這些型別的資料,bc(即地址)是通用的指標,即主要指的是右邊的針,持有一級指標變數指標變數。

18樓:四舍**入

int *p :一級指標,表示p所指向的地址裡面存放的是一個int型別的值,宣告p為指向整型數的指標,這時為這個指標分配了儲存空間。但這時其中是隨機數,我們稱它為指向一個不確定的記憶體地址。

使用者說的「直接*p=5」,那麼就會在一個無法預知的記憶體地址寫入一個整型數5。這是不允許的,可能導致程式崩潰。

p=&a; 則是把已有的變數a的地址寫入指標p,我們稱使指標指向a. 可以通過p對變數a正常操作。

19樓:leap灬『躍

記憶體都是用地址編好了每一」格「的,一個地址對應一「格」,定義一個指標時,系統為指標隨機賦一個記憶體大小範圍內的地址,所以該指標肯定指向記憶體的某一「格」。如果沒對指標進行賦值便使用(如p->next之類的),一般情況下在windows中執行時會提示非法訪問記憶體,然後程式崩潰(除錯時經常出現的情況),如果其他作業系統沒有這樣保護的話,可以使得指標任意訪問記憶體,這是非常危險的,所以儘量別出現野指標。

1、因為定義的指標已指向一個地址,所以可以*p=5;

2、定義指標時並不是開闢記憶體空間,指定指標型別主要是為了在 *p 訪問指標指向內容時可以確定怎樣讀取這塊連續的記憶體(例如int與long所佔的位元組是不同的)

20樓:春風不醉人

呵呵,這個問題不會太糾結:

在定義 int *p 時,系統隨機給p一個值,其對應記憶體中一處空間,並非為空(不信可以自己試試,當你不對p賦值時列印*p,這是有輸出的);

讓p = &a; 這是為p 賦初值,讓p指向程式設計師指定的地址(之前是隨機的,非為程式設計師指定的),它原來的記憶體空間仍然存在,且這不涉及釋放不釋放的問題(只在動態申請時存在釋放的問題);

不知我說的是否清楚,o(∩_∩)o~

21樓:

int *p; 宣告p為指向整型數的指標,這時為這個指標分配了儲存空間。但這時其中是隨機數,我們稱它為指向一個不確定的記憶體地址。

如果象你說的「直接*p=5」,那麼就會在一個無法預知的記憶體地址寫入一個整型數5。這是不允許的,可能導致程式崩潰。

p=&a; 則是把已有的變數a的地址寫入指標p,我們稱使指標指向a. 可以通過p對變數a正常操作。

22樓:***x櫻

**都不指,記憶體裡是隨機值

不可以直接*p=5

23樓:無言de結局

c的話定義之後是隨機值

c語言關於學指標剛開始的一個小問題

24樓:

沒啥區別。指標變數其實就是個整數(其實是無符號整數unsigned int,不過高位系統裡可能已經是unsigned long long了),裡面一般用來存地址罷了。

所謂地址,也就是記憶體的一個儲存單元的編號,其實就是整數啦。

好比a變數的值存在了第123456個記憶體單元裡,a的地址就是123456,b變數裡存了123456這個值。

第一段**可以通過*b取到a的值(第123456個記憶體單元裡的值)。

所以對於第二段**,同樣也能通過 *((int*)b)取到a的值(也是第123456個記憶體單元裡的值)。

至於(int*),因為int是四個位元組的,就是說要一下子取4個位元組,就是說明一下,在取*的時候,把123456, 123457, 123458, 123459這四個記憶體單元裡的值拿出來拼成一個int。

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

printf c p 3 分佈來看,c是要列印輸出一個字元。p指向那個字元陣列,p就是字元 a 那麼 a 3是多少呢,a 1是b 2 是c 3 是d注意是 p 3 而不是 p 3 這是由區別的。是的。p 3。是對p指向的那個值加3,p開始是指向a的,故a加3後就是d了 而p 執行3次的話,是指標p本...

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

指標在用要注意初始化,例如 int p p為指標,地址是未知的,如果直接賦值 p a 這樣編譯可以通過,但是會產生警告,p的地址是隨機分配的,這樣對未知的地址賦值很危險,可能會覆蓋掉某些重要資料,所以避免這種危險,在定義指標時注意初始化,也就是賦值。可以int p a 或者int p p a 然後再...

C語言指標問題,求教大神C語言指標的問題搞不懂求大神指教

include include include include include static char chongpai char static int pare const void const void static int allocateintegerarr const char size ...