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 ...