C語言 指標

2021-09-24 11:36:19 字數 3215 閱讀 6609

先說說指標的基本概念:

1.指標就是個變數,用來存放位址,位址唯一標識一塊空間。

2.指標大小固定的4/8個位元組(32位平台/64位平台)。

3.指標是有型別的,指標+1,是指加上其所指向型別的大小。

字元指標

在指標型別中,我們知道有一種指標型別為字元指標char*。

使用方式:

int

main()

char* str=「world!!!」,是將字串首元素的位址放在str中。**中字串放在字元常量區。若前面是char str=「world!!!」,則字串是放在棧上。

來看看下面**輸出的結果是什麼?

因為str1和str2都是在棧上申請的空間,位址是不同的。只不過他們的內容恰好相等。但是str3和str4他們是指標變數,指向字元常量區的同乙個字串首元素的位址,所以相等。

**注意:**字元常量區的字串,不能被改寫。

int

main()

指標陣列首先我們最應該知道的一點:指標陣列是陣列,是乙個存放指標的陣列。

int

*arr1[10]

;//整形指標陣列

int*

*arr2[15]

;//字元指標陣列

那麼如何來判別指標陣列呢?

根據名稱左右符號的優先順序來判定,此處優先順序高於*,因此是陣列,所以就是指標陣列。

陣列指標

首先我們也應該知道的一點:陣列指標是指標,是能夠指向陣列的指標。

int

*p1[10]

;//指標陣列

int(

*p2)[10

];//陣列指標

判定方法與指標陣列相同,看優先順序。

這裡我們回憶一些關於陣列的知識

1.除了sizeof 和 取位址時,陣列名代表的是整個陣列。其他情況下陣列名代表陣列首元素的位址。只不過整個陣列的位址和陣列首元素的位址在數值上是相等的。

2.作為函式引數的陣列名,降維為指向內部元素型別的指標。

3.任何陣列作為函式引數,只能省略一維引數,其他維引數都不能省略。

看下面**:

1.因為指標型別是陣列指標,又因為指標+1,是指加上其所指向型別的大小。所以p+1相當於+40。

2.因為強轉為整型,所以(int)p+1,就只是+1。

3.因為強轉為指標型別,所以(int*)p+1,代表+4。

再來看看下面**,猜猜結果:

1.由結果可看出,陣列名(也就是陣列首元素位址)和陣列位址是相同的,但是他們的意義不同。

2.陣列名+1是第二個元素的位址。所以+4。

3.陣列位址+1,是下乙個陣列的位址。所以+40。

陣列指標的使用:

void

print_arr1

(int arr[3]

[5],

int row,

int col)

void

print_arr2

(int

(*arr)[5

],int row,

int col)

intmain()

;print_arr1

(arr,3,

5);print_arr2

(arr,3,

5);return0;

}

**中兩個函式引數中,接收二位陣列的兩種形式,都是可以的。因為我們知道陣列名作為函式引數,會降維成指向陣列內部元素型別的指標。此時陣列內部元素型別是陣列。所以降維成陣列指標型別。用print_arr2更好些。

函式指標:

首先看一段**:

通過結果我們可以發現,輸出的是函式的位址。那麼我們怎麼來儲存函式位址呢?這就要用到函式指標了。

函式指標的使用:

void

test()

intmain()

{void

(*p)()

=test;

//這就是函式指標,儲存的是函式的位址。

//若指向的函式有引數,比如:test(int a),則函式指標如下

void

(*p)

(int

)=test;

return

0;

注意:與陣列不同的是,void *p(),不是指標函式。他就是返回值為 void *的函式。

C語言指標

指標變數是包含記憶體位址的變數,它指向記憶體中的一塊區域,通過指標的值,可以間接訪問到相應的記憶體單元的資料,並做相應的修改。1 指標的定義和簡單使用 定義乙個指標變數和定義一般的變數類似,只需在變數名前面加乙個 對乙個指標變數賦值可以用取位址符 來獲取到乙個變數的位址,如果要獲得指標指向的記憶體區...

C語言指標

1 定義指標變數void change int n 格式 變數型別 變數名 定義了乙個指標變數p 指標變數只能儲存位址 指標變數p前面的int 指標變數p只能指向int型別的資料 int main void change int n 2 指標與陣列 陣列名其實質是乙個指標,但是它和普通的指標變數還是...

c語言指標

編寫程式,在主函式裡用指標陣列輸入六個字串,再用另乙個函式對這六個字串排序,並在主函式中輸出排好序的字串。include void sort char s,int n char temp for int i 0 ifor int j 0 jif strcmp s j s j 1 0 temp s j...