先說說指標的基本概念:
1.指標就是個變數,用來存放位址,位址唯一標識一塊空間。
2.指標大小固定的4/8個位元組(32位平台/64位平台)。
3.指標是有型別的,指標+1,是指加上其所指向型別的大小。
字元指標
在指標型別中,我們知道有一種指標型別為字元指標char*。
使用方式:
char* str=「world!!!」,是將字串首元素的位址放在str中。**中字串放在字元常量區。若前面是char str=「world!!!」,則字串是放在棧上。int
main()
來看看下面**輸出的結果是什麼?
因為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。
陣列指標的使用:
**中兩個函式引數中,接收二位陣列的兩種形式,都是可以的。因為我們知道陣列名作為函式引數,會降維成指向陣列內部元素型別的指標。此時陣列內部元素型別是陣列。所以降維成陣列指標型別。用print_arr2更好些。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;
}
函式指標:
首先看一段**:
通過結果我們可以發現,輸出的是函式的位址。那麼我們怎麼來儲存函式位址呢?這就要用到函式指標了。
函式指標的使用:
注意:與陣列不同的是,void *p(),不是指標函式。他就是返回值為 void *的函式。void
test()
intmain()
{void
(*p)()
=test;
//這就是函式指標,儲存的是函式的位址。
//若指向的函式有引數,比如:test(int a),則函式指標如下
void
(*p)
(int
)=test;
return
0;
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...