1 - 指針對應的數組元素ios
1 int ages[5]={10,9,8,7,6}; 2 int *p = ages;// 等同於:int *p = &ages[0]; 3 // 第1個元素的地址 p,&ages[0] 4 // 第2個元素的地址 p+1,&ages[1] 5 // 第3個元素的地址 p+2,&ages[2] 6 // ......
2 - 示例代碼:利用指針,遍歷出數組元素數組
1 int ages[5]={101,19,21,33,22}; 2 int *p = ages; 3 for(int i=0;i<5;i++) 4 printf("%d\t",*(p+i)); 5 printf("\n");
3 - 數組元素的三種訪問形式緩存
(1) 數組名[下標]iphone
(2)指針變量名[下標]spa
(3) *(指針變量+下標)指針
1 char *arr[4]={"ios","iphone","ipod","abc"}; 2 printf("%s \n",arr[1]);// 輸出:iphone 3 printf("%c \n",*(*(arr+1)+2));// 輸出:h 4 printf("%s \n",arr[2]);// 輸出:ipod 5 printf("%c \n",*(arr[2]+3));// 輸出:d
注 指針變量的+1或-1到底是加、減多少?這取決於指針的類型:若是是 char 類型的指針就加1個字節;若是是 int 類型的指針則加4個字節code
4 - 利用指針來接收一個數組,指針變量指向數組的首元素blog
1 void change(int array[]);// 等價於 void change(int *array)
5 - 數組名錶明數組的首元地址,它是一個指針常量,指針能夠當數組名使⽤,區別是二者在內存中所佔字節數不同ip
1 char string[10] = "iphone"; 2 char *p = string; 3 printf("%p \n", p);// 輸出地址:0x7fff5fbff62e 4 5 *(p+1)='P';// 操做單個字符串 6 printf("%s\n",p);// 輸出:iPhone 7 printf("%c\n",*p);// 輸出:i 8 printf("%c\n",*(p+2));// 輸出:h 9 10 p++;//向高位偏移 11 printf("%s \n",p);// 輸出:Phone 12 printf("%c \n",*(p+1));// 輸出:h 13 printf("%s \n",string);// 輸出:iPhone 14 printf("%s \n",string+1);// 輸出:Phone
1 - 比較兩行代碼有什麼不一樣內存
1 char name[] = "it"; 2 char *name2 = "it"; 3 4 name[0]='g'; 5 printf("%s\n",name);// 輸出:gt 6 7 *name2= 'y';// 運行到此句崩潰 8 printf("%s\n",name2);
解析:name 是字符串變量,*name2是字符串常量。C語言的數組元素存放於棧,裏面的元素能夠隨便修改,稱爲字符串變量;而字符串常量存放於常量區,會緩存起來是不可更改的
1 char *name1 = "it"; 2 char *name2 = "it"; 3 printf("%p\n%p\n",name1,name2);// 地址是同樣的,說明 name1 和 name2 指向的是同一個字符串
指針數組
1 - 定義:以整型數組爲例,在這個數組中存放的都是整型,那麼指針數組就是在數組中存放的都是指針
1 int ages[5] = {0}; 2 char *name[10]={"jack","rose","dany"};// 等同於 char name[3][10] = {"jack","rose","dany"};
2 - 指針數組的重指向
1 char melee[3][20] = {"李小龍","查克·諾里斯","增根泰三"}; 2 char *firstFighter[3] = {"fist","foot","waist"}; 3 firstFighter[0] = &melee[0][0];// 從新指向 4 printf("%s\n",*firstFighter);// 輸出:李小龍
3 - 在控制檯中,何輸入字符串?(使用數組,爲何?由於可變)
1 char name[20]; 2 printf("請輸入姓名:\n"); 3 scanf("%s",name); 4 printf("您輸入的姓名是:%s\n",name);