1. 程式人生 > >關於指標和陣列的知識點總結

關於指標和陣列的知識點總結

  一級指標:

難點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表示跳到下一個陣列

(對於這個陣列而言就是跳過了十個元素,用地址來說就是跳過了10*4個位元組),arr+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指向下一個元素的地址