C語言指標詳解

2021-10-10 22:07:19 字數 4167 閱讀 6375

什麼是指標?

指標就是變數,不過他是儲存其他變數位址的變數。
為什麼要使用指標?

因為指標可以通過改變位址來實現傳址和值的改變
如何宣告乙個指標

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...