指針就是地址。 指針的類型決定了指針操作時該指針指向地址變化的規(guī)律。 int arr[10], *p; p=arr; 此時把數組的地址賦給了指針p,指針p就指向了數組的首地址。 現在假設數組的首地址值是3452,則指針p的值必然是3452。 那么 p 1 表示指針移動指向了數組的下一個元素, 那么p 1的值等于3452 1==3453?錯誤 這里的p 1不是簡單的算術運算,它表示——指針移動了一個整型元素。一個整型變量占多少字節(jié)內存:2 個字節(jié),所以指針移動一個整型元素后地址值應為3452 2,即指針p的值為3454。 字符型指針: char aa[10], *p; p=aa; 同樣假設數組的首地址為3452,那么p 1 的值可以這樣考慮,指針移動一個字符的地址,而一個字符占一個字節(jié)的內存,所以p 1的值就為3452 1=3453。 數組名代表了數組的起始地址,如 char arr[5][6]; 那么數組名 arr就是這個二維數組的首地址。這樣的寫法:char arr[5][6], *p; p=arr;是錯誤的, 二維數組名是一個二級指針,是地址的地址 char arr[5][6]; char **p; p=arr;這樣寫同樣是錯誤的 例1: int arr[4][5]; int *p; p=arr[0];//正確
arr[0]是int一維數組,arr[0]這個一維數組的各元素才是基本的int數據類型 下面的寫法: char arr[4][5]={"abc","def","ghi","jkl","mno"}; char *p=arr[0]; for(i=0;i<20;i ) printf("%c", *(p i) ); //仔細觀察輸出的值是怎樣變化的
1、必須使這個指針指向與其對應的字符型數據類型; 2、指針每增加一個單位的地址值 。 printf()語句輸出的結果為" abcdefghijklmno"
下面舉一個整型指針的例子: int arr[3][3]={ {1,2,3},{4,5,6},{7,8,9}}; int *p=arr[0]; for(i=0;i<9;i ) printf("%d", *(p i)); // 逐個的輸出數組元素 一個二維數組的指針它有哪些特點: 一個二維數組,它的每一個數組元素都是一個一維數組, 一個整型二維數組可以寫為: int arr[3][3]; 即 {arr[0], arr[1], arr[2] } 指針 p指向arr[0], 指針 p 1 指向arr[1] ,指針 p 2指向arr[2], 也就是指針每移動一個單位的地址就指向下一個一維數組, 實際上移動一個一維數組的長度即3個整型量。 那么這個指針可定義為如下形式: int (* p) [3] ; // 定義了一個指向二維數組的指針,這個二維數組中的一維 數組有3個元素。 p=arr; // 把二維數組的地址賦給指針 p char arr[3][4]={"abc","def","ghi"}; *(p 0) //是數駔 a[0] 的首地址 printf("%s", *p); 輸出字符串 “"abc" *(p 1) //數組a[1]的首地址 printf("%s", *(p 1)); 輸出字符串 "def" *(p 2) //數組 a[2]的首地址 printf("%s",*(p 2)); 輸出字符串 "ghi" 如果要用這個二維數組的指針逐個的輸出字符可以寫為: *(*(p 0) 0) //第一個字符 a *(*(p 0) 1) //第二個字符 b *(*(p 0) 2) //第三個字符 c *(*(p 0) 3) //第四個字符 d *(*(p 0) 4) //第五個字符 e .................. 依此類推
當指針指向結構時的情形。。。 一個結構數組,三個結構: struct student { int a;char *b; }stru[3]= { {1,"abc"}, {2,"def"}, {3,"ghi"} }; struct student *p=stru; p 0 //第一個結構的地址 p 1 //第二個結構的地址 p 2 //第三個結構的地址
====================================
定義一個二維數組: inta[3][4]; 表示二維數組有三行四列共12個元素,在內存中按行存放,每行四個元素 a是二維數組的首地址, &a[0][0]既可以看作數組0行0列的首地址,同樣還可以看作是二維數組的首地址, a[0]是第0行的首地址,當然也是數組的首地址。 同理a[n]就是第n行的首址;&a[n][m]就是數組元素a[n][m]的地址。 把二維數組看成是由n行一維數組構成,將每行首地址傳遞給指針變量,行中的其余元素均可由指針來表示。 用地址法來表示數組各元素的地址。對元素a[1][2],&a[1][2]是其地址,a[1]+2也是其地址。 分析a[1]+1與a[1]+2的地址關系,它們地址的差并非整數1,而是一個數組元素的所占位置2,原因是每個數組元素占兩個字節(jié)。 對0行首地址與1行首地址a與a+1來說,地址的差同樣也并非整數1,是一行,四個元素占的字節(jié)數8。 由于數組元素在內存的連續(xù)存放。給指向整型變量的指針傳遞數組的首地址,則該指針指向二維數組。 int *ptr,a[3][4]; 若賦值:ptr=a;則用ptr++就能訪問數組的各元素。 //用地址法輸入輸出二維數組各元素。 #include<stdio.h> main() { int a[3][4]; int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d",a[i]+j);/*地址法*/先輸行,一行滿了之后再輸下一行 for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%4d",*(a[i]+j));/**(a[i]+是j地)址法所表示的數組元素*/ printf("\n"); } } 運行程序: 輸入:1 2 3 4 5 6 7 8 9 10 11 12
輸出: 1 2 3 4 5 6 7 8 9 10 11 12
//用指針法輸入輸出二維數組各元素。 //把二維數組看作是展開的一維數組 #include<stdio.h> main() { int a[3][4],*ptr; int i,j; ptr=a[0]; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d",ptr++);/*指針的表示方法*/ ptr=a[0]; //重新指向數組第0行 for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%4d",*ptr++); printf("\n"); } }
|