c 學習 指標

2021-09-20 12:52:46 字數 2670 閱讀 4545

1.&符號:作用獲取變數位址,這個位址並不一定是整數(跟編譯器是有關係的),我們用以下方法輸出這個變數位址

printf("%p",&i);
2.指標:我們在&符號中可以知道變數位址的資料型別跟整數不一定一樣,所以我們不能直接用int來接收變數位址,但是我們用過scanf函式,可以知道scanf函式一定有方法可以接收這個變數位址。

這個東西就是指標,或者說指標就是儲存位址的變數,int *p=&i;

我們的普通變數的值就是實際的值而指標變數的值是具有實際值的變數的位址。

void f(int *p)

int main()

//首先我們定義*p後,p就是變數的位址,而*p則可以指向這個變數的值

//我們傳給函式變數位址後,函式內部如果對這個變數進行修改,外面的這個變數也會改變(在函式內部通過指標訪問外部的這個i)

所以我們可以看出來*和&是互相反作用,&i是得到i的位址,*p是得到位址p對應的變數值

2.2 指標的應用

1.可以在函式中交換變數值(普通的變數在函式中交換是對函式外的變數沒有影響的)

void swap(int *pa,int *pb)

2. 有的時候函式要返回多個值,但是只能return乙個,這個時候我們可以通過給指標賦值從而改變函式外的變數的方法來解決這個問題。

2.1 我們有的時候讓函式返回運算的狀態,運算結果用指標返回

3.指標中容易犯的錯誤

我們定義了指標變數,在還沒有給他指向任何變數的時候就開始使用指標

int *p;

*p=12; //這樣是不正確的,這個時候指標還什麼都沒有

2.3指標和陣列

我們可以發現乙個事,在函式內改變陣列的某個值,函式外該陣列對應的值也改變了,這就和普通變數不一樣了,但是和指標的特性是相同的;而且我們在函式外看陣列a的位址和在函式內看陣列a的位址,發現是一模一樣的,這就證明了乙個事,陣列就是乙個指標,我們在宣告函式時,引數列表中的int a變成int *a也可以,不會出現錯誤,函式內照樣可以訪問a[1]等值。、

陣列變數是特殊的指標:

1.陣列變數本身表達位址,所以

int a[10]; int *p=a; //這裡我們不用給a加上&符號

但是陣列單元表達的是變數我們要用&去位址

a==&a[0]

2.運算子可以對陣列做,也可以對指標做

int min=10;

int *p=&min;

printf("%d",p[0]) //這是合理的,p指向min這個變數(也可以將這個變數看成是長度為一的陣列),p[0]表示min的值

3.*運算子可以對指標做,也可以對陣列做

*a就表示a陣列裡的第乙個值

4.陣列變數是const的變數,所以不能被賦值(兩個陣列直接賦值是不可以的)

2.4指標與const

我們知道指標可以表示指標本身,也可以表示指標指向的那個值

eg: int *const q=&i; //q是const

接下來 *q=26這個操作是可以的,q++這個操作是不可以的

如果所指是const:表示不能通過這個指標去修改那個變數(並不能使那個變數成為const)

eg: const int *p=&i;

接下來 *p=26是錯誤的

但是i=26是可以的 而且p=&j也是可以的

我們的const有多種放法

const int* p1=&i;

int const*p2=&i;

int *const p3=&i;

const在*的前面表示指標所指不能修改,const在*的後面表示指標不能修改

我們對陣列也可以進行const

const int a=;

這時陣列變數已經是const的指標了,這裡的const表明陣列的每個單元都是const int

而且這裡必須通過初始化進行賦值

2.5指標運算 

int main()

; char *p=ac;

printf("p=%p\n",p);

printf("p=%p\n",p+1);

int ai=;

int *q=ai;

printf("q=%p\n",q);

printf("q=%p\n",q+1); //sizeof(char)=1;sizeof(int)=4; 加的是sizeof所指的資料型別

//通過以上運算我們可以發現指向char的指標加一之後和之前相差1,指向int的指標加一後與之前相差4.這正好是sizeof(資料型別)的大小,所以說指標加一,並不是它本身的大小加一,而是指向的位址加一,

//如指標p一開始指向ac也就是ac,加一後指向ac,所以位址就增加了乙個sizeof(char)的長度

//所以對指標加一就意味著指向下乙個單元,所以對於 指標不是指向一片連續分配的空間,如陣列,這種運算就是沒有意義的。

//當我們用指標進行相減時得到的不是兩個指標間位址差,而是兩個指標的位址差/size(資料型別)

//也就是說是告訴我們兩個指標相差幾個單元

return 0;

}

*p++因為++運算子的優先順序高於*的優先順序,但是p++的意思是先要p一開始的結果,最後加個一,所以總共的意思是我們取出p所指的那個資料,完事後把p移到下乙個位置上去

C學習 指標

1 指標 a int a 表示乙個記憶體空間,這個空間用來存放乙個整數 int b int a 表示乙個記憶體空間,這個空間用來存放乙個指標,這個指標指向乙個存放整數的空間,即 a 中提到的空間 c int a 表示乙個記憶體空間,這個空間用來存放乙個指標,這個指標指向乙個存放指標的空間,並且指向的...

C 指標學習

一 指標的概念 如果在程式中定義乙個變數,在編譯時系統會自動給這個變數分配記憶體單元,並根據程式中的定義的變數型別,分配一定長度的記憶體空間,這樣的記憶體單元裡放著變數的值。為了便於記憶體單元的訪問,系統為每乙個記憶體單元分配乙個位址。在變數的生存期內,不管以後對變數如何賦值,其記憶體位址都是固定不...

C 學習 指標

關於二級指標的學習遇到了一些困惑,也有了一些不知是否正確的結論。在文章中留個底以記錄學習過程。author 以下是一些暫時的結論 1.將每個變數名都理解成位址 2.注意區分堆與棧中的變數 3.表示取左值 根據位址跳轉 表示取位址 宣告時表示建立乙個引用 ex.char string aaa char...