① 【c語言,為什麼類型不同的指針不能被賦值】
對於指針變數本身,所需的存儲空間不管是什麼類型的,都是一致的,區別在於它指向的變數的類型,不同的編譯系統對類型所需空間的大小也是不一樣的。例如有的int就是2個位元組,而有的就是4個位元組。
如果int是2個位元組,float是4個位元組,那麼將其地址放在指針變數以後,類型決定了通過指針變數來操作指向的數據,是從起始地址開始的順序幾個位元組中存取數據,如果是int型,那就是從地址開始的2個位元組中存取數據,如果是float型,那就是從地址開始的4個位元組中存取數據。這才是你提的問題的根本區別所在。
② C語言指針的賦值問題
指針在用要注意初始化,例如:
int *p;
p為指針,地址是未知的,如果直接賦值
*p=a;這樣編譯可以通過,但是會產生警告,p的地址是隨機分配的,這樣對未知的地址賦值很危險,可能會覆蓋掉某些重要數據,所以避免這種危險,在定義指針時注意初始化,也就是賦值。
可以int *p=&a;
或者int *p;
p=&a;
然後再對p進行操作
有錯。
注意大小寫,還有
int a=9;
int *p;
p=&a;//這個是指針指向a
*p=8;
這樣就對了。
(2)C語言不能對指針賦值擴展閱讀:
指針的賦值
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改動該字元串的值,由於該字元串為常量,而它僅僅是簡單的將指針指向該字元串常量。
③ 在C語言中能否直接給指針指向的數據賦值為什麼
可以直接給指針指向的數據賦值。
因為*p操作是這樣一種運算,返回p的值作為地址的那個空間的取值。存放地址的變數稱為指針變數。指針變數是一種特殊的變數,它不同於一般的變數,一般變數存放的是數據本身,而指針變數存放的是數據的地址。
在使用一個指針時,一個程序既可以直接使用這個指針所儲存的內存地址,又可以使用這個地址里儲存的函數的值。
(3)C語言不能對指針賦值擴展閱讀:
兩個地方要注意:
1、在程序聲明變數的時候的*,只是表明「它是一個無符號整數,這個整數指向某個內存地址,一次訪問sizeof(type)長度」。這點不要和(*)操作符混淆;
2、在C++程序聲明變數的時候的&,只是表明「它是一個引用,這個引用聲明時不開辟新空間,它在內存分配表加入新的一行,該行內存地址等於和調用時傳入的對應參數內存地址」。
這點不要和(*)聲明符,(&)操作符混淆。
網路-指針
④ 在C語言中能否直接給指針指向的數據賦值為什麼
肯定能。
但你編寫的:int
*p;*p=7;這樣的程序不對。因為「能直接給指針指向的數據」賦值,而你編寫的小程序里的p還沒有指向,所以不能賦值;
這個指針叫「懸浮指針」,也叫野指針,它不能被賦值的。需要這樣編寫才可以:int
a,*p=&a;*p=7;
⑤ C語言中可以給指針變數賦值常數嗎
C語言中可以給指針變數賦值常數,賦值方法為:
1、首先打開Microsoft Visual C++軟體,單擊「文件」菜單->「新建」,新建一個文件,文件名後綴為.c。
⑥ c語言中,為什麼不能對字元指針變數指向的字元串再賦值
因為C語言中,凡是以""括住的形式直接出現,而且你又沒有為其分配內存空間的字元串都是常量字元串,是不能修改其值的。
這樣:
char a[6]="hello";
a[2]='c';
就可以了。
這里你為hello分配了一個長度為6的字元數組空間來存放。
(6)C語言不能對指針賦值擴展閱讀:
給字元數組賦值的方法
1、定義的時候直接用字元串賦值
char a[10]="hello";
注意:不能先定義再給它賦值,如char a[10]; a[10]="hello";這樣是錯誤的!
2、對數組中字元逐個賦值
char a[10]={'h','e','l','l','o'};
3、利用strcpy
char a[10];
strcpy(a, "hello");