關於指標和陣列的知識點總結
一級指標:
難點1,指標是怎樣儲存一個地址
例如: char str1[]="hello world"(這裡雖然定義的是陣列,但其實在初始化時隱式退化成指標,儲存的是首字元的地址'h')
char *str2="hello world"(這裡表示str2指向一個常量字串),如果這時還有一個char str3[]="hello world",和char* str4="hello world",那麼str1==str3? str2==str4?
str1和str3存的是一個地址,兩個字元陣列的記憶體地址不一樣,故str1!= str2
而str2和str3指向同一個常量字串的地址,所以str2 == str4
難點2,指標作為引數要注意的點
指標作為函式的形參時,改變形參指標q的指向並不會改變實參指標p的指向(即輸出的值不變),如果要改變輸出的值,就需要對指標指向的內容進行改變(解引用形參指標q)
#include<stdio.h>
//錯誤的例子,這樣是無法改變輸出結果的
void test(int* q){
q = 50;
}
int main(){
int a = 10;
int* p = &a;
test(p);
printf("%d", *p);
return 0;
}
二級指標
二級指標儲存的是地址的地址,也就是一級指標的地址,二級指標**pp和一級指標*p和一級指標指向的常量a之間的關係就是,常量a改變->一級指標p改變->二級指標pp改變,對二級指標進行一級解引用*pp,其實得到的就是一級指標p的地址,改變*pp的值就是改變p的值,對二級指標進行二級解引用**pp得到的就是a的地址,改變**pp的值就是改變a的值
二級指標的用法
#include<stdio.h>
void test(int** ptr){
printf("%d\n", **ptr);
}
int main(){
int n = 666;
int* p = &n;
int** pp = &p;
test(pp);
test(&p);
return 0;
}
指標陣列和陣列指標
指標陣列int* p1[10]實質上是一個數組,陣列指標int (*p2)[10]實質上是一個指標,
對於陣列指標int(*p)[10] 和指標陣列int* arr[10] ,p+1 和 arr+1的意義完全不一樣,陣列指標的p+1表示跳到下一個陣列
指標陣列的用法:int arr[10]={1,2,3,4,5,6,7,8,9,0} int (*p)[10]=&arr 每個p指標指向一個數組的地址,p+1指向下一個陣列的地址
陣列指標的用法: int arr[10]={1,2,3,4,5,6,7,8,9,0} int *p[10]=&arr 每個p指標指向一個元素的地址,p+1指向下一個元素的地址