指針對資料操作的許可權
)指標:指標就是位址。
指標變數:儲存的資料型別是指標的變數叫做指標變數。
形式:儲存的資料型別 *變數名,eg:char *p;
指標型別的大小:與系統型別和編譯器型別有關。eg: 64位系統、64位編譯器中 指標是8位元組
指標訪問資料:非宣告狀態下,表示解位址,使用p,可以通過指標變數儲存的位址訪問資料。
tip :
1)指標變數首先是乙個變數,他有自己的位址;指標變數可以儲存位址,儲存的位址就是他需要訪問的空間位址;
2)指標型別代表他儲存的資料型別,影響從儲存的位址開始尋找多長的位元組。
3)對某一變數如int a=10; &a取得的是虛擬位址
int a=10;
int *p=&a;
*p=12;
printf(「%d %d\n」,a,*p);//輸出均為12;
因為a代表的記憶體和p指向的記憶體是同一塊空間,所以無論是用哪種方法對這塊記憶體中的資料進行操作都直接改變該資料。
指針對資料訪問的許可權有待更新…
指針對常量,無法獲得其位址
int *p=&10;//這樣的操作是非法的
注意:真常量與偽常量
類似於10這樣的數值是真常量,此時無法使用指標獲取其位址,上述操作會在編譯器報錯;
類似於「hello」這樣的常量字串是偽常量,可以獲取其位址,但不能進行寫操作,寫操作時發生錯誤,在執行期報錯。
2. 型別不匹配的錯誤
int a=10;
int *p=&a;
int *s=「hello world」;
p=s;
printf(「%s\n」,p);//雖然可以對資料進行訪問,但是資料格式錯誤,出現亂碼(因為p是int指標)
對於系統自動分配的唯讀空間,進行寫操作,會造成許可權錯誤,如段錯誤或匯流排錯誤
char *s="helloworld";//s指向的這塊空間在靜態區,只能讀不能寫
char *p=s;
*p=100;
printf(「%d\n」,*p);//因為這塊空間只能夠進行讀取,而不能進行儲存、修改等操作,此時就會出現段錯誤或匯流排錯誤。
指標獲得某塊記憶體的位址後,脫離其有效範圍後就會成為非法訪問。
如使用指標進行區域性變數的訪問:
if(s[0]=='h')
printf("%d\n",*p);//k是區域性變數,脫離k的適用範圍(上面**塊)後,再使用指標訪問就會變成非法訪問;
//原先的位址空間其實已經得到了釋放,這塊空間中的資料隨時會被其他的資料填充
脫離變數有效的範圍後,原先的位址空間其實已經得到了釋放,這塊空間中的資料隨時會被其他的資料填充。指標指向乙個已經釋放的空間,使用指標訪問該空間就是非法訪問,導致野指標訪問。 C語言指標
指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...
C語言指標
1 定義指標變數void change int n 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 int main void change int n 2 指標與陣列 陣列名其實質是乙個指標,但是它和普通的指標變數還是...
c語言指標
編寫程式,在主函式裡用指標陣列輸入六個字串,再用另乙個函式對這六個字串排序,並在主函式中輸出排好序的字串。include void sort char s,int n char temp for int i 0 ifor int j 0 jif strcmp s j s j 1 0 temp s j...