指針與多維數組
多維數組地址的表示方法:
二維數組s[3][4] 定義 int s[3][4]={ {0,2,4,6},{1,3,5,7},{9,10,11,12} }

根據以上的一個二維數組的例子,就有如下表示:

注意:S代表着二維數組的首地址,s+1代表第一行的首地址,而s[1]代表着第一行第一列的地址,雖然s+1和s[1]都是代表着同一個地址,但是他們還是有區別的。比如:*(s[0]+1)是訪問第0行第1列的值,既然s=s[0],那么*(s+1)是訪問第0行第1列的值這種說法是錯誤的,因為s+1,s,s+2是每一行數組的首地址,不牽扯到列的概念,所以是行操作。需要進行行轉列,將s視為由s[0],s[1],s[2]組成的一維數組,那么,s[0]=*(s+0),所以s[0+1]=*(s+0)+1=&s[0][1],即s[i]+j=*(s+i)+j=&s[i][j]。
總之:s[1]=s+1是地址上的相等,操作上是不相等的。而
S[1]=*(s+1)不僅地址是相等的,操作也是相等的。
指向多維數組的指針變量 實例
1234567891011 |
# include <stdio.h> main() { int a[ 3 ][ 4 ]={{ 0 , 2 , 4 , 6 },{ 1 , 3 , 5 , 7 },{ 9 , 10 , 11 , 12 }}; int *p; for (p=a[ 0 ];p<a[ 0 ]+ 12 ;p++) { if ((p-a[ 0 ])% 4 == 0 ) printf( "\n" ); printf( "%4d" ,*p); } } |

指向由m個元素組成的一維數組的指針變量 實例
1234567891011 |
# include <stdio.h> main() { int a[ 3 ][ 4 ]={{ 0 , 2 , 4 , 6 },{ 1 , 3 , 5 , 7 },{ 9 , 10 , 11 , 12 }}; int (*p)[ 4 ],i,j; p=a; printf( "請輸入要輸出的數組坐標" ); scanf( "%d,%d" ,&i,&j); printf( "s[%d,%d]=%d\n" ,i,j,*(*(p+i)+j)); } |

指向多維數組的指針作為函數參數。實例
題目:一個班有3個學生,各四門課程,計算總平均分數和第n個學生的成績。
1234567891011121314151617181920212223242526 |
# include <stdio.h> main() { void average(float *p, int n); void search(float (*p)[ 4 ], int n); float score[ 3 ][ 4 ]={{ 65 , 75 , 54 , 80 },{ 78 , 90 , 89 , 76 },{ 66 , 76 , 87 , 90 }}; int n; average(*score, 12 ); printf( "enter a number to n:\n" ); scanf( "%d" ,&n); search(score,n); } void average(float *p, int n) { float *p_end=p+n,aver= 0 ; for (;p<p_end;p++) aver=aver+*p; aver=aver/n; printf( "Average=%7.2f\n" ,aver); } void search(float (*p)[ 4 ], int n) { int i; for (i= 0 ;i< 4 ;i++) printf( "%7.2f" ,*(*(p+n)+i)); } |

指針與字符串
字符數組
123456 |
# include <stdio.h> main() { char string[]= "I am a student" ; printf( "%s\n" ,string); } |

注意:(1):字符數組的長度要加上最后的結尾標志(“\o”);
(2)string數組名代表數組首地址,string+4表示第4個元素的地址
(3)%S表示整體輸出,%X表示16進制輸出,%C是一個字符。如果是%d,則輸出的就是地址。
字符指針
123456 |
# include <stdio.h> main() { char *string= "I am a student" ; printf( "%s\n" ,string); } |

string是指向字符串的指針變量,存放了元素首地址,*在此毫無意義,表示指針類型。
字符數組與字符串指針的區別
(1)存儲方式:字符數組:分配一個存放元素的單元。
字符串指針:分配一個存放元素地址的單元,地址指向元素首地址。不
是將整個字符串放到字符指針變量中。
(2)賦值方式:
字符數組:char str[16]={“a,b,c”}
字符串指針: char *str=”abc” char *str; str=”abc”;
(3)定義方式:
字符數組:char str[10];scanf(“%s”,str);
字符串指針:char *str,a[10];str=a;scanf(“%s”,str); 指針str必須得指向一個數組,
不然就是野指針了。
(4)運算方面
字符數組:字符數組名是常量,不能進行運算,不能改變值。如:
char a[]=”abc”; a=a+1;這是錯誤的。
字符串指針: 指針變量的值是可以改變的,可以進行運算,如++,==等操作。
如:char *a=”abc”; a=a+1;這是正確的
字符串指針作為函數參數
1234567891011121314151617181920 |
# include "stdio.h" # include "string.h" void inv(char *s) { for (;*s != '\0' ;s++) { if (*s>= 65 && *s<= 90 ) *s+= 32 ; else if (*s>= 97 && *s<= 122 ) *s-= 32 ; } } main() { char *string,a[ 10 ]; string=a; gets(string); inv(string); puts(string); } |

這個程序是大小寫轉換的一個程序 。注意結束標志“\0”中的0是數字0,而不是字母o .