C語言中不是說指標變數是存放某個變數地址不能存放常量嗎

時間 2021-08-30 10:37:16

1樓:匿名使用者

這兩個程式都沒有錯誤,沒有不允許存放常量的要求。

第1個程式,給指標變數賦初值為0,意思是給定一個初始值用於以後判斷指標是否有效,通常初始化會寫成int *p=null;這個null就是0值,然後在程式中使用p之前要判斷

if ( p==0 ) 出錯處理; //或者 if ( p==null ) 出錯處理;

這是一種使用指標的慣常做法。

右邊**中,嚴格來說,b是肯定沒問題的,但d有可能正確,前提是x的地址恰好是1024,這種情況一般會出現在嵌入式設計(微控制器等記憶體小的cpu)中,但多數情況d是會錯的,除非有一系列其他語句(比如預處理語句等)配合才能實現正確。明確一點,這個錯不是因為指標變數被賦值了一個常量引起的,而是程式設計者無法知道變數x的地址是哪一個數而寫入程式。

2樓:聽不清啊

c語言中說的是指標變數只能存放某個變數地址不能存放除0以外的常量(常量0是一個特殊值,常量0表示空指標null)。

3樓:匿名使用者

這個問題問地很好,這裡有個細節問題

2中:char *p1 = 0;

這樣的定義,不是將指標p指向的內容置0,而是將指標p的地址置0(空指標)

1中:d選項:寫成char *p1 = 1024;,則意味著p指向的內容置1024,這是不允許的(因為不能確定p指向**),也就是說,同樣的定義,如果後面是0,則成功,如果後面是數,則失敗。

如果你硬是要將指標地址置成某一常數,可以這樣寫:char *p1 =(char *)1024;

但這樣寫很有風險,你無法確定地址單元1024中是什麼內容,有可能是系統中的重要資料

1中b選項,在定義時直接指定其指向的地址,是正確的

c語言中可以給指標變數賦值常數嗎?

4樓:會飛的小兔子

1、申請了空間(在常量區),存放了字串

2、在字串尾加上了'/0'

3、返回地址,這裡就是返回的地址賦值給了p

字串常量"hello"出現在一個表示式中時,"hello"表示式使用的值就是這些字元所儲存的地址(在常量區),而不是這些字元本身。所以,可以把字串賦值給指向字元的指標p,而不能把字串賦值給一個字元陣列。

chara[10]=“hello”;//這樣可以,這種情況是c語言初始化所支援的,如果寫成chara[10],然後a=“hello”這樣就錯誤了。同樣是a陣列,chara[10]=“hello”;這種是陣列的初始化,和a[0]=‘h’a[1]=‘e’,是一個道理。

換成chara[10],然後a=“hello”就不行了“hello”賦值的值是一個地址,而a雖然也有地址,但是這與指標是不一樣的,指標的值是地址,而陣列的值雖然也是地址,但是卻是一個常量,所以不能給常量賦值。

擴充套件資料

c語言中給指標變數賦值常數注意事項

在使用指標的時候,指標可以自增,而陣列不能自增,編譯器給陣列分配了空間,陣列a的地址就是一個常量了,讓常量自增這肯定是不行的。 在指標自增的時候,編譯器會自動識別型別,比如指標是指向int型的,想獲取下一個的地址時,指標直接p++就行了。

特別需要注意的是,在void指標使用的時候,不能使用指標運算,應為void型編譯器不能識別型別的長度(即指標所指物件的體積),p++這樣就是不合法的,即不能進行數**算,也不能使用*取值操作,想使用必須轉換為其它的型別。

5樓:a羅網天下

如:char *p,a='5';

p=&a;

p="abcd";

解析:p申請了空間(在常量區),存放了字串,所以最後可以返回地址。

以字串形式出現的,編譯器都會為該字串自動新增一個0作為結束符,如在**中寫

"abcd",那麼編譯器幫你儲存的是"abcd\0"。

1、定義指標變數的一般形式如下:

型別名*指標變數名1,*指標變數名2,... *指標變數名n ;

2、空指標

空指標是一個特殊的指標,它的值是0,c語言中用符號常量null(在stdio.h中定義)表示這個空值,並保證這個值不會是任何變數的地址。空指標對任何指標型別賦值都是合法的。

一個指標變數具有空指標值表示當前它沒有指向任何有意義的東西。

3、void指標

(void *)型別的指標叫通用指標,可以指向任何的變數,c語言允許直接把任何變數的地址作為指標賦給通用指標。

但是需要注意void*不能指向由const修飾的變數,例如const int test; void * ptv; ptv = &test;第三句是非法的,只有將ptv宣告為const void * ptv;,上述第三句ptv = &test才是合法的。

當需要使用通用指標所指的資料參加運算時,需要寫出型別強制轉換。如通用指標ptv 所指空間的資料是整型資料,p是整型指標,用此式轉換:p=(int *)ptv;

6樓:匿名使用者

賦值當然可以啊,不能用地址引用

舉例://int

int * p = new int;

*p = c_int_1; //這個是可以的,賦值p= c_int_1; //這個不可以,地址複製了//字串

char * p;

p = "abc"; //字串這樣就可以,因為這個常量編譯器自動賦予了空間

7樓:今天沒有睡

不可以 因為這是不可預見的 如果指到了你記憶體中的重要訊息,電腦可能會出問題啊,所以千萬不要賦常數給指標變數

8樓:匿名使用者

準確地說,只能賦值0,其他的都不合法

9樓:匿名使用者

不能,變數怎麼能賦值呢,變數時變化的不是一定值

10樓:匿名使用者

只有字元指標可以,直接等於字串常量

11樓:匿名使用者

不可以 指標變數只能指向地址

12樓:情漫都市

一般不允許。很可能系統報錯

13樓:匿名使用者

指標時用來存放地址的!地址就是個常數啊!所以這樣是能編譯通過的!

但是,這樣執行會出錯(段錯誤)的!因為指標本來是存放地址的,而你卻存放了一個常數(即一個不合法的地址),這樣就會使指標指向不確定的記憶體單元(非法訪問),從而出現錯誤!

c語言中的指標中的*和&什麼意思,指標到底是什麼東西,指標變數和指標常量又是用來幹嘛的?

14樓:gta小雞

如果把每個記憶體

copy單元比作一個房間,那麼它們的地址就是門牌號。指標變數中儲存的是其他變數的地址,即房間記憶體放的是其他房間的門牌號。例如有變數int a=2,其地址為0x402000,則a代表a的內容,為2;&a代表取a的地址,為0x402000;定義指標int *p=a,則p的內容是a的地址0x402000,*p的內容是p指向的地址的內容,即a的內容,為2.

c語言裡為什麼字元指標變數指向的字串常量中的內容是不可取代的?

15樓:風若遠去何人留

其本質就是常量值不可修改。

c語言中定義為常量的值,是不允許被修改的,這是一個規則。如果有修改需求,就不要定義為常量,而是定義為變數。

在執行時,常量字串會被儲存於特定的常量空間,這段空間的特性就是隻讀的,任何修改操作,均會引起整個程式崩潰。這也是c語言保證常量不可修改的一個手段。

16樓:潘達

const宣告的是常量所在的段是隻讀的,程式不是所有地方都能改的,是有許可權的,只讀的儲存區是不能寫操作的,你只要寫,就係統一定彈出異常資訊,告訴你是隻讀的,操作無效,如果你想改就別宣告稱常量,當然你也有改的辦法,去exe檔案裡改吧,只要你能找到地方。。。。

17樓:

指向字串常量的話,這段常量字串是儲存在靜態儲存區的,內容不能修改。

當然你可以讓指標指到別的地方

18樓:

系統記憶體會劃分如下區域:常量資料區、棧區、自由儲存區、堆區 、全域性/靜態區,其中常量存放在常量資料區,這個區域是隻讀的,用指標也無法改變這塊區域的內容。

19樓:尼瑪真響亮

您說的是類似這種把:char *a = "abcdefg"; ?

如果重新賦值,lz可以用陣列來做,char a = "abcdefg";

20樓:ai看雪

常量就是常量,不是變數,不能改變

c語言中,為什麼不能對字元指標變數指向的字串再賦值?

21樓:大野瘦子

因為抄c語言中,凡是以""括住的形式直接出襲現,而且你又沒有為其分配記憶體空間的字串都是常量字串,是不能修改其值的。

這樣:char a[6]="hello";

a[2]='c';

就可以了。

這裡你為hello分配了一個長度為6的字元陣列空間來存放。

22樓:種令芮德曜

char*

a=為什麼不能修改,這個要涉及程序佔用的記憶體分段,大概分為**區,只讀

區,全域性區專,堆屬區,棧區。"hello"作為一個字串字面值,是被放在只讀區,只讀顧名思義就是不能修改的。char*

a="hello",相當於把hello的地址賦給了a,故而不能對a指向的內容進行修改。char

a="hello",這樣賦值的就是一個字元陣列。字元陣列a是在棧區裡申請的一個空間給a,然後把只讀區的"hello"進行了一次複製再賦值給a,這樣a的指向是能修改的。

23樓:匿名使用者

c primer plus 一書中寫到:“內容”為字串面量,其被視為常量,故無法再進行修改。只能對其指標的值(改變位置)進行修改,不能改變其內容。

24樓:

這不是絕對的:

bai當指du

針指向的字串是zhi常字串時當然不能再賦dao值,因為目標是“常量專”,而當指標

屬指向的字串不是常字串時就可以再賦值,比如用動態申請記憶體方法建立的字串。具體說就是用char *p="abcqer12345";這種方法定義字串是不能通過指標改變內容的,原因是這個定義確定了abcqer12345是字串常量——因為char *p="abcqer12345";被編譯器解釋為“建立一個字串常量abcqer12345,並把它的首地址(就是a的地址)賦給char *型指標p”——既然是“常量”,自然就不能更改。

25樓:匿名使用者

c語言bai中,凡是以""括住的形式直du接出現,而且你zhi又沒有為其分配內dao

存空間的字

符串專都是常量字串,是屬不能修改其值的。

char a[6]="hello";

a[2]='c';

就可以了。這裡你為hello分配了一個長度為6的字元陣列空間來存放。

26樓:匿名使用者

char *a="hello";

''hello''是常量,所以a指向的是常量區,不能對於常量區的元素進行賦值

27樓:匿名使用者

char *a="hello";這個形式的定義是屬於字串常量,不可以修改的.

28樓:匿名使用者

不能修改!

char *p="hello";

相當於 const char *p="hello"

以這種方法初始化的字串是常量字串,而系統預設對常量賦初值後,其值無法被修改,否則會報錯,所以不能修改。

c語言中指標變數怎麼理解?怎麼用

指標變數是一個變數,它儲存的是另一個變數的記憶體地址。你如果知道了這個指標變數儲存的值,就可以知道它所指向變數的記憶體地址,於是就可以間接訪問到那一個變數。定義 指標變數型別 指標變數名1,指標變數名2,例如 int main void 把指標作為函式的引數傳遞,可以使函式可以訪問函式外部的變數,例...

c語言中如何交換兩個指標變數的的值

小小歐平兒 1 首先,就是最基本的知識,寫標頭檔案 函式宣告 定義變數。2 下面還需要定義指標,需要定義兩個指標p1和p2,然後把a的位址賦值給p1,把b的位址賦值給p2。3 然後就是呼叫函式,該函式沒有返回值,就直接呼叫,但是引數進入的是a和b的位址,而不是a和b。4 函式點用完之後,就是輸出a和...

c語言中指標變數指向陣列怎樣使其移回第一位

王天旻 include main int p p a printf d p 1 最原始的方法,p加幾就只向哪一位。不加就指向0位 移回第一位的問題我也碰到過,可以這樣 int q q p 然後對p操作,最後 p q 移回來把指標當引數時常有。 長巷煙雨 說錯了,陣列名是常量指標 而不是指標常量。樓主...