1樓:匿名使用者
char c[80]; //你為c開設了80個位元組的儲存區來折騰
char *c; //你沒有開設儲存區,那麼如何或者說在**去倒騰字串呢?
char *a="i am"; //這裡雖然自己沒有開設空間,但是偷懶行為,是依賴系統的常數儲存區
char a="i am"; //或者寫char a[5]="i am";才是正常寫法,是自己開設的儲存區
不是自己開設的變數和儲存區操作起來容易出系統錯誤。
int a; int *p; p=&a; //雖然你在賦值階段沒有直接為p開設儲存區,但p=&a;實現了讓p指向自己開設
//的a變數儲存區來進行後續操作
連結串列中作為指標一定在使用前要確認指向自己程式開設的儲存區,否則就要出錯;移到下一個資料域時如果這個域你沒有申請儲存區那麼可以認為是不存在的,所以需要用malloc開儲存區
2樓:captainz鈥唊
這個你只要瞭解指標的用法你就明白了,指標是指向地址的一個資料型別 比如int b = 2; int *a = &b;那麼a就指向b所在的地址。最通俗的就是a是門牌號b是房子,吧a掛在b上你就可以通過a找到b;並且如果不限制你,你也可以進入這個房子修改裡面的東西。 回來說你上面的問題,如果換成
char *c;那麼c就是個門牌號,如果不用malloc申請空間,就相當於只有門牌號沒有房子,你通過c這個門牌號找到的房子不是你的,但是你還欺騙這些字串說這裡有房子,他們相信你了,他們進去了就和原來主人打架,然後就把房子拆了這就出錯了。malloc相當於給你自己建房子,你就可以合法居住了。每個門牌號都要有一個屬於自己的合法房子所以你說的移到下一個資料域時還要重新申請空間,是因為你的門牌號變了!!!!
3樓:匿名使用者
char c[80]; 作業系統執行時會給程式分配80byte的連續棧記憶體空間,如果寫成char *c 則只是一個指標而已,不會分配連續的空間以存放字串的。
而char * a = "blabla";
這裡的"blabla"位於呈程式的字串常量區,程式被裝入的時候就會分配地址。, char* a 也只是一個指標而已。
關鍵在於「分配地址空間」
4樓:匿名使用者
malloc申請記憶體空間是有風險的,如果內衣這麼個連續的記憶體空間,那麼申請記憶體空間就會報錯,用陣列最保險
在連結串列中,每個節點都必須重新申請記憶體空間,
5樓:匿名使用者
為指標申請存取資料的記憶體啊
c語言中,定義一個指標的時候為這個指標開闢儲存空間嗎?
6樓:海天盛筵
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(即地址)是通用的指標,即主要指的是右邊的針,持有一級指標變數指標變數。
7樓:四舍**入
int *p :一級指標,表示p所指向的地址裡面存放的是一個int型別的值,宣告p為指向整型數的指標,這時為這個指標分配了儲存空間。但這時其中是隨機數,我們稱它為指向一個不確定的記憶體地址。
使用者說的「直接*p=5」,那麼就會在一個無法預知的記憶體地址寫入一個整型數5。這是不允許的,可能導致程式崩潰。
p=&a; 則是把已有的變數a的地址寫入指標p,我們稱使指標指向a. 可以通過p對變數a正常操作。
8樓:leap灬『躍
記憶體都是用地址編好了每一」格「的,一個地址對應一「格」,定義一個指標時,系統為指標隨機賦一個記憶體大小範圍內的地址,所以該指標肯定指向記憶體的某一「格」。如果沒對指標進行賦值便使用(如p->next之類的),一般情況下在windows中執行時會提示非法訪問記憶體,然後程式崩潰(除錯時經常出現的情況),如果其他作業系統沒有這樣保護的話,可以使得指標任意訪問記憶體,這是非常危險的,所以儘量別出現野指標。
1、因為定義的指標已指向一個地址,所以可以*p=5;
2、定義指標時並不是開闢記憶體空間,指定指標型別主要是為了在 *p 訪問指標指向內容時可以確定怎樣讀取這塊連續的記憶體(例如int與long所佔的位元組是不同的)
9樓:春風不醉人
呵呵,這個問題不會太糾結:
在定義 int *p 時,系統隨機給p一個值,其對應記憶體中一處空間,並非為空(不信可以自己試試,當你不對p賦值時列印*p,這是有輸出的);
讓p = &a; 這是為p 賦初值,讓p指向程式設計師指定的地址(之前是隨機的,非為程式設計師指定的),它原來的記憶體空間仍然存在,且這不涉及釋放不釋放的問題(只在動態申請時存在釋放的問題);
不知我說的是否清楚,o(∩_∩)o~
10樓:
int *p; 宣告p為指向整型數的指標,這時為這個指標分配了儲存空間。但這時其中是隨機數,我們稱它為指向一個不確定的記憶體地址。
如果象你說的「直接*p=5」,那麼就會在一個無法預知的記憶體地址寫入一個整型數5。這是不允許的,可能導致程式崩潰。
p=&a; 則是把已有的變數a的地址寫入指標p,我們稱使指標指向a. 可以通過p對變數a正常操作。
11樓:***x櫻
**都不指,記憶體裡是隨機值
不可以直接*p=5
12樓:無言de結局
c的話定義之後是隨機值
c語言指標符號問題,C語言指標符號問題?
當你想儲存一個地抄址的時候不加 int a 0 p a 當你想取指標裡的值 的時候加 int b b p b a b 0 就是說把a地址儲存的值取出來。當 p的值還是指標的時候 int p null int q null int a 0,b 1 q a p q p a 結果就是q 指向a p指向q ...
c語言指標問題初學者,C語言指標問題(初學者)
1.概念問題 指標是指存放地址值的變數或常量 指標與一般變數或常量的區別,在於它不直接儲存數值,而是存放被儲存數值的地址,屬於間接存放,所以不少初學者感覺學習困難。比如表示將指標ptr指向變數a,存放a的地址,假設是2000h,而指標變數ptr本身也要有地址,假設是3000h,明顯 ptr和 ptr...
c語言簡單問題
估計樓主的int是16位的,10的階乘越界了,因此是一個負數,或者你試試把int改unsigned int,表示的數大一倍 如果輸入負數應該列印 data enter error,然後返回個0就好了。負數好像沒階乘的吧 else printf data enter error 寫成else 否則最後...