什麼是指標?
指標就是變數,不過他是儲存其他變數位址的變數。
為什麼要使用指標?
因為指標可以通過改變位址來實現傳址和值的改變
如何宣告乙個指標
int *p; //宣告乙個int型別的指標p
char *p; //宣告乙個char型別的指標p
int *arr[10]; //宣告乙個指標陣列,該陣列有10個元素,其中每個元素都是乙個指向int的指標
int (*arr)[10]; //宣告乙個陣列指標,該指標指向乙個裝有int型別的一維陣列
int **p; //宣告乙個指標p,該指標指向乙個裝有int型別的指標的位址
指標的初始化
方法1:
int a = 1;
int p = &a;
方法2:
int *p;
p = (int*)malloc(sizeof(int)*10);
free(p); //程式結束之後,要釋放記憶體
指標的運算
第一種:
p++、p--、p+i;
p++就是指標所指的位址向後移動乙個操作符
第二種:指標-指標
只有當兩個兩個指標指向同乙個陣列時,才允許指標相減。減法運算是指計算兩個指標在記憶體中的距離,因為減法運算的結果將除以陣列元素型別的長度。
舉個栗子:
#include
int[10
]=;int sub;
int*p1 =
&a[2];
int*p2 =
&a[6];
sub = p2 - p1;
printf
("%d"
,sub)
;return
0;
結果為4
指標與陣列
int a[10]; //宣告乙個陣列
int *p; //宣告乙個指標
p = &a[0]; //對指標進行初始化,p指標指向陣列a的第1個元素a[0];
p = a; //a為陣列名,代表該陣列最開始的乙個元素的位址;
指標陣列和陣列指標
指標陣列:首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是「儲存指標的陣列」的簡稱。
eg:int *p1[10];
陣列指標:首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是「指向陣列的指標」的簡稱。
eg:int (*p2)[10];
我們要知道的優先順序要高於*的,所以int *p1[10];他是乙個裝有10int型別的指標。而int (*p2)[10];就是乙個指向裝有11個int型別元素陣列的指標。
指標和結構體
#include
struct message
;typedef
struct message s_massage;
a_massage mess =
; 我們可以通過結構名.成員的方式來訪問結構中的成員,如下:
#include
int main()
#include
typedef
struct
message;
intmain()
;
message *p =
&mess;
//指標p指向這個結構體
printf
("%s\n"
,p->name)
;// 輸出結果為:luoqifeng
printf
("%d\n"
,p->score)
;// 輸出結果為:23
return0;
}
說明一下:*p指向的就是指向的結構體第乙個屬性。
指標函式與函式指標
首先我們要搞懂傳"址"和傳"值"
1、什麼是傳值?傳值就是將實參的值賦值給行參,相當於copy。那麼對於行參的修改,不會影響實參的值。
2、什麼是傳址?傳址就是傳值的一種特殊方式,只是她傳遞的是位址,不是普通的賦值,那麼傳位址以後,
實參和行參都指向同乙個物件,因此對行參的修改會影響到實參。
看**:
#include
void
swap
(int n1,n2)
intmain()
執行結果:a的值10b的值20
a的值10b的值20
我們可以看出a和b的值並沒有改變。因為a和b雖然把值傳給了n1和n2,並且n1和n2的數值也完成了他們的交換,
但是這也僅僅只是n1和n2的之發生了改變,和a,b是沒有關係的。這是一次單向的傳遞過程,a、b能傳給n1、
n2,n1、n2能成功互換其數值,但n1、n2是定義在函式swap中的區域性變數,當函式呼叫結束後,它倆就over了,
被殘忍拋棄了(子函式的生命期為子函式開始呼叫到結束呼叫,呼叫結束後就主動釋放了),因此它們沒有渠道
把交換的值傳回給a、b。
接下來看指標函式和函式指標的概念:
指標函式本質是函式,返回值是乙個指標。
函式指標是指向函式的指標,乙個指標指向乙個函式。這和指標可以指向整型變數、字元型、陣列一樣,這裡指的是函式。
c語言在編譯時,每乙個函式都有乙個入口位址,該位址就是函式指標所指向的位址。有了指向函式的指標變數以後,
可以利用該指標呼叫函式,就如同用指標引用其他變數一樣。函式指標有兩個用途:呼叫函式、做函式的引數。
函式指標,直接結合**:
#include
void
(*p)
(int data)
;void
myfun
(int data)
intmain()
通過這個**我們可以看出,首先我定義了乙個函式指標p,記住這是乙個指標,乙個變數。
然後我給函式指標賦值,也就是p = myfun這一句。myfun的函式名就是函式的首位址,
因此p就獲得了函式的首位址。最終呼叫myfun
()
指標函式
當乙個函式宣告其返回值是乙個指標時,實際上就是返回乙個位址給呼叫函式。
宣告方式:型別 *函式名(引數) eg:int *myfun(); int *yourfun(int,int,int)
首先他是乙個函式,只不過這個函式的返回值是乙個位址值。函式的返回值必須由同型別的指標變數來接收,也就是說,指標函式一定有返回值,並且在主調函式中,函式的返回值必須是賦給同型別的指標變數。
#include
int*fun
(int
*a)int
main
(int argc,
char
**ar**)
輸出結果是:3
#include
int*fun
(int
*a)int
main
(int argc,
char
**ar**)
輸出結果是:6487580
兩個**的區別就是乙個列印的是*(fun(&a)),另外乙個是fun(&a),由此可以看出int fun(int *a)它返回的是乙個位址
第乙個只是通過*,來得到位址的值
c語言指標詳解
一.指標的概念 指標是乙個特殊的變數,它裡面儲存的數值被解釋成為記憶體裡的乙個位址。要搞清乙個指標需要搞清指標的四方面的內容 指標的型別,指標所指向的型別,指標的值或者叫指標所指向的記憶體區,還有指標本身所佔據的記憶體區。1.指標的型別 從語法的角度看,你只要把指標宣告語句裡的指標名字去掉,剩下的部...
C語言指標詳解
類似於 int p char p 或者自定義型別的 person p struct p 這些都是基本的指標變數,不管什麼型別的指標變數都是乙個存位址的變數,所以它們的大小都是四個位元組 還有一種void p 型別,類似於 js 或者 c 的 var 可以傳入任何型別變數的位址,也可以轉換成任何型別變...
C語言指標詳解
c語言指標應用 一 指標是什麼 指標是乙個特殊的變數,它存的是記憶體裡的乙個位址。指標四要素 1.指標的型別 把指標名字去掉,剩下的部分就是這個指標的型別。這是指標本身所具有的型別如下 1 int p 指標的型別是int 2 char p 指標的型別是char 3 int p 指標的型別是int 4...