C語言的靈魂 指標基礎

2022-08-01 06:27:12 字數 3689 閱讀 9583

一、什麼是指標

1、指標的定義:位址形象化為指標,通過指標能夠找到記憶體單元。

指標變數就是位址變數,變數的值為指標。

指標其實是我們將變數名和位址的關係顯化(獨立)出來的一種形式,是為了我們更加方便的讀取資料和進行操作而設計的,是c語言的靈魂。

解釋:

int

a;printf(

"%d,a

");

如上,我們通常是通過變數名來引用變數的值,如上面的printf("%d,a");

一句,我們就是通過引用a的變數名來輸出變數a的值。

為了理解上述的概念,我們必須理解這兩個概念:

儲存單元的位址  系統分配位址  類似於房間號

儲存單元的內容  自定義內容   類似於房間裡的人

2、常用的兩種訪問方式

直接訪問  間接訪問

int

a;a = 3;//

直接訪問

printf("

%d,a");

//間接訪問

int *a_pointer;

a_pointer = &a;

printf(

"%d,*a_pointer

");

直接訪問就是通過變數名進行訪問,間接訪問就是通過指標進行訪問。

二、指標變數

1、定義指標變數

方式:型別名 *指標變數名

int *p;// int——基型別,不可少

基型別用來指定此類指標變數可以指向的變數型別。如上面的p指標只可以用來指向整數型別的變數。

zu:指標變數是基本資料型別派生出來的資料型別不能脫離基型別而獨立存在。

int a,*a;

double b,*p;

float *p;

上面的定義都是正確的。

「 *  "用來表示該變數是指標變數.

如上面的 int a,*a;我同時定義了整數型變數a,和整數型指標變數a。

2、不同指標型別,不能混用

int

a;int *p;

char *t;

p = &a;//

√t = &a;//

×

變數的指標包含儲存單元的純位址和該變數的資料型別兩方面。

3、指標變數只可以儲存位址

int a, *pointer;

a = 100;//

√pointer = 100;//

×

三、兩個重要的指標操作符

&  取位址運算子

*  指標運算子(我更習慣叫他取內容運算子)

int a=100

;int *pointer;

pointer = &a;//

取出a的位址賦給pointer,此時pointer指向a(即pointer的值是a的位址)

if(*pointer==100)//

取出pointer所指向的變數的值(即取出pointer儲存的位址下的內容),在這裡是a的值,然後進行比較

printf(「ture!」);//

輸出ture!

四、指標變數作為函式引數

1、兩種傳遞方式   (函式通過引數(實參、形參)的傳遞來實現資料或位址的相互呼叫)

①值傳遞

值傳遞不改變實參的值,而是傳遞實參的值。

位址傳遞可能改變實參的值,傳遞的是實參的位址,可以通過位址訪問資料。

例項:

//

交換函式

#includeint

main()

void swap(int *p1,int *p2)

五、通過指標引用一維陣列

陣列元素的指標就是陣列元素的位址。

所以:兩式等價

int *p,a[10];

p=&a[0];

p=a;

1、陣列中指標的運算

指標擁有兩類運算,一類是賦值運算,一類是算術運算。

指標指向的是位址,賦值運算代表的是位址的賦值。那算術運算代表什麼意思呢?

其實代表的是(通過算術運算)而導致指向的位址的改變。

1)運算規則:自加(p++,++p)、自減(p--,--p)

加減整數(p+n,p-n)

這些運算代表什麼意思呢:

首先我們定義乙個陣列int a[10],乙個指標變數int *p=a;並賦值

此時的p代表的是陣列a首元素的位址——就是a[0]的位址

那麼p+1代表什麼呢?

2)講解乙個a[i]和p+i的聯絡與區別

[ ] 是變址運算子,a[ i ]按a+i計算位址,然後找出此位址單元中的值,所以我們常用的a[i]法引用陣列元素值的方法和指標呼叫其實區別不大。

2、通過指標引用陣列元素的兩種方法

1)下標法。a[ i ]形式

2)指標法。如*(a+i)的形式,a為陣列名,i為陣列的序號。

例子:便利陣列元素。

前提是定義了陣列a[10

]for(int *p=a;p<(a+10);p++)

*p=0;//

陣列元素置零

或for(int i;i<10;i++)

a[i]=0;

3)值得注意的一點就是陣列名代表陣列元素的首位址,那麼他就是乙個指標型常量,它的值在程式執行的過程中是不變的,無法實現自加自減運算(a++  a --  ×)

但是我們可以通過賦值將首位址複製到指標變數中,然後再進行運用  如:for(int *p=a;p<(a+10);p++)

。3、特殊表示式分析:

1、*p++由於++與*同優先順序

所以:先輸出*p的值,然後使p值加1,即現在的p是p+1

解釋:如果有乙個陣列,p指向a[

0],執行過一次*p++後,*p++代表的意義是a[1

]的內容。

2、*p++等價於*(p++)

有時候我都感覺很奇葩,如果就從字面上來看*(p++),很明顯,這裡的意義是先使得p++,就是p自加之後取值,但是事實上卻是和上面的意義是一樣的。

3、*(++p)

相當於a[++i]

意義:先使p加1,在取*p。

4、*(p--)

相當於a[i--]

意義:先求*p,再使p減1.

5、*(--p)

相當於a[--i]

先使p自減1,然後取*p

6、++(*p)

意義:先取*p,然後加1.

六、陣列名用作函式引數

我們之前在傳遞陣列到函式裡的時候,通常都是以陣列名作為實參進行傳遞,而形參通常會設定為陣列。

例子:

//

主體省略,已定義陣列 array[100]

fun(array,100

);void fun(int arr,int

a)//其實也可以這樣做

void fun(int *arr,int

a)

上面兩種方法等價。為什麼呢?

因為我們實際上傳遞的是位址,而arr[ ]和*arr是等價的。所以我們已陣列作為形參和以指標變數作為形參其實意義是一樣的。

我們在考略一些東西的時候我們一定要使用抓住主要,捨棄次要,理解關鍵,專注細節,明白實質的方法。

而我們函式傳遞陣列的時候實質便是位址的傳遞,所以我們只要能夠傳遞位址的方法不都是可以的嗎?

指標 C語言的靈魂

1.2指標的型別 指標的型別 去掉變數名,剩下的的就是指標型別 int p int 整形指標 int arr 3 int 3 整形陣列指標 int p int a,int b int int a,int b 返回值為整形的函式指標 int arr 4 int 4 指標陣列,指向陣列的指標 指標所指向...

C語言之靈魂 指標學習

指標是c語言的難點 稱之為c語言的靈魂一點也不為過,不過指標用好了能事半功倍,用不好bug滿天飛。一 指標的概念 指標也是變數只不過是特殊的變數,指標的值是另乙個變數的地 也就是變數所在的記憶體位址 指標的定義 在變數名之前加 號即可。如 char point 二 指標的應用 1.指標與普通變數 指...

C語言的靈魂 指標基本用法

指標 pointer 是乙個值為記憶體位址的變數 或資料物件 記憶體位址一般使用16進製制來表示。通俗的理解為,變數就是乙個記憶體,記憶體肯定有記憶體位址,而我們的指標就是來儲存這個記憶體位址的變數。資料型別 指標變數名 例如int ptr num char ptr name float money...