位址的大小是否與int相同取決於編譯器。
int i; printf("%p",&i);
指標就是儲存位址的變數。
使用*運算子,*是乙個單目運算子,用來訪問指標的值所表示的位址上的變數。
可以做左值也可以做右值。
如:int k = *p; *p = k+1;
左值之所以叫左值是因為出現在賦值號左邊的不是變數,而是值。
交換兩個變數的值:
void swap(int *pa, int *pb)
函式返回多個值,某些值就只能通過指標返回。
定義了指標變數,還沒有指向任何變數,就開始使用指標。
函式引數表中的陣列實際上是指標。但是指標可以用陣列的運算子進行運算。
以下函式原型是等價的:
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar, int n);
int sum(int , int);
陣列變數是特殊的指標,陣列變數本身表達位址,所以int a[10]; int *p = a;不需要使用&取位址。
[ ]運算子可以對陣列做,也可以對指標做。
*運算子可以對指標做,也可以對陣列做。
陣列變數是const的指標,所以不能被賦值。
指標和值都可以是const
如果指標是const,表示一旦得到了某個變數的位址,就不能再指向其他變數了,
int *const q = &i; //表示q是const
*q = 26是正確的賦值
q++則是錯誤的。
指標所指的是const,表示不能通過這個指標去修改那個變數,(並不能使得那個變數成為const)
const int*p = &i;
*p = 24 //是錯誤的,因為(*p)是const
i = 26 //是正確的
p = &j //正確
看一下下面這些是啥意思?
int i;
const int* p1 = &i;
int const* p2 = &i;
int *const p3 = &i;
//判斷哪個被const了的標誌是const在*的前面還是後面,const在*後面則表示指標是const
const int a = ;
這裡的const表示陣列的每個單元都是const int,所以必須通過初始化進行賦值。
保護陣列值,因為把陣列傳入函式時傳遞的是位址,所以那個函式內部可以修改陣列的值。
為了保護陣列不被函式破壞,可以設定引數為const。
int sum(const int a, int length);
給乙個指標加1表示要讓指標指向下乙個變數。
如果指標不是指向一片連續的分配的空間,如陣列,則這種運算沒有意義。
取出p所指的那個資料來,完事之後順便把p移到下乙個位置去。
*的優先順序雖然高,但是沒有++高。
記憶體中是有0位址的,但是0位址通常是不能隨便碰的位址。
所以指標不應該具有0值。
null是乙個預定定義的符號,表示0位址。注意有的編譯器不願意你用0來表示0位址。
指標的型別:指向不同型別的指標是不能直接互相賦值的。
void*表示不知道指向什麼東西的指標,指標也可以轉換型別。
int *a = (int *)malloc(n*sizeof(int));
malloc:#include
void * malloc(size_t size);
向malloc申請的空間的大小是以位元組為單位的。
返回的結果是void*,需要型別轉換為自己需要的型別。
如果申請失敗則返回0,或者叫做null。
free():把申請得來的空間還給系統,申請的空間最終都要還,只能還申請來的空間的首位址。
C語言之指標
指標型別的本質分析 1 指標的本質 指標的本質 一種復合的資料型別。下面我將以下面幾個作為例子進行展開分析 a int p b int p c int parvalue 3 d int pfun 分析 所謂的資料型別就是具有某種資料特徵的東東,比如資料型別char,它的資料特徵就是它所佔據的記憶體為...
C語言之指標
指標的概念 什麼是指標?如果用一句話概括的的話那就是,乙個存放記憶體空間位址的變數。指標也是乙個變數,指標存放的內容是乙個位址,該位址指向乙個記憶體空間。指標變數的定義 int p 該變數用來存放乙個空間的位址。p 代表該指標指所指向記憶體空間中的值,切記指標只能存放有效的記憶體空間位址,不能存放其...
C語言之指標
指標是c語言學習乙個重要的概念,它極大的方便了c語言程式設計,用好了指標可以幫助我們程式設計,但是同時指標也是飽受爭議,因為指標的使用很容易出錯,所以在一開始學的時候就弄懂有關指標的知識點是必要的。那麼指標是什麼呢?其實指標也是一種變數,和其他型別的變數一樣,也是儲存資料的,只是在指標變數裡面儲存的...