一、一維數組
定義:類型名 數組名[數組大小] ;注:數組大小不可是變量,只可是數字或宏定義值
列:char arr1[5]={‘1’,’a’,’A’};
char arr3[]={“1aA”};//arr[]=”1aA”同於arr[]={“1aA”}
define N 5
int arr[10];
char arr[N];//此處arr[N]=arr[10]
sizeof(arr)/sizeof(arr[0]);//求數組大小,此法僅用於和數組定義在同一函數中,若以數組作爲函數參數,則作爲形參的函數中不可求數組大小(因爲此時sizeof(arr)計算的是首元素所佔字節,而不是數組總字節大小),因此數組作爲參數時,應將數組大小一起傳遞。
注:一維數組名錶示數組首地址
1、strlen();參數爲數組地址,統計數組中傳入的地址到’\0’之前的元素個數,不包含’\0’;數組中無’\0’,則返回一個隨機值
2、一維數組中只能存放一個字符串,存放字符串時將其拆爲多個字符存放在數組中
列:char arr3[5]=”1a\0A”;arr[0]=1;arr[1]=a,arr[2]=\0,
arr[3]=A,arr[4]=’\0’,arr[5]=null;
3、字符\0和\n打印出來爲空格和換行而不是\0,\n
二、二維字符數組
1、二維數組相當於由多個一維數組組成
2、定義:
char arr[3][3]={{‘1’,’2’,’3’},{‘3’,’4’,’7’},{‘5’,’\0’,’1’}};
有3*3個元素。
二維數組大小計算:
sizeof(arr)/sizeof(arr[0][0]);//數組總大小.3*3/1=9,有3*3/1個元素,字符1個元素佔1個字節
注:二維數組名代表數組首地址
1、&arr=&arr[0]=arr+0=&arr[0][0],表示0行0列元素地址
2、&arr[0][j]=arr[0]+j=arr+j=&arr[0][j],0行j列元素地址
3、二維數組中,i行的地址與i行的第一個元素地址值相同,表示範圍不同
即*(arr+i)=arr[i]//表示i行地址
sizeof(arr[0])=sizeof(*(arr+0))//第0行元素所佔字節
4、字符數組存放字符(一維與二維相同),若無’\0’則用strlen()函數求出的數組大小爲隨機值,有’\0’則求的值爲從傳入遞的地址到第一個’\0’之前的大小
三、二維字符串數組
定義:
char ch1[3][5]={"123","你h",{"anv"}};//前一個數3表式字符串個數,後一個數5表式每個字符串最大長度(字符個數-1),包含'\0'
sizeof(ch1) 數組所佔總字節大小
sizeof(ch1)/sizeof(ch1[0]) 計算數組可存多少字符串
strlen(ch1[i])計算第i個字符串的字符個數不含'\0'
ch1表式首地址
ch1[0] 表式第一個字符串地址
&ch1[i][j] 表式第i個字符串的第j個字符地址
sizeof(&ch1) 一個地址變量所佔字節大小(4)
sizeof(ch1[i]) 一個字符串所定義字節大小 5
sizeof(&ch1[0]) 一個地址變量所佔字節大小(4)
四、指針數組
定義:
char *arr2[]={“123as”};//指針數組不可省去{}
char *arr3[2]={{“\n1a”},{“123\043”}};
char *arr4[3][2]={{“12345”,”ABC”},{“abcd”},{“你好”}};//漢字可存 儲在字符指針變量或字符指針數組中
注:
1、指針數組中使用strlen()計算字符串中字符個數時,會跳過’\0’,統計除’\0’的所有字符。非指針數組計算時統計’\0’之前字符
2、’\0和’\n’不可用字符方式輸出打印,輸出爲換行和空格。注:若’\0’後有數字,則還可能輸出其他字符
3、數組中的每個字符串都有 1個地址
4、指針數組arr[i],表示第i行的地址,即存放arr4[i][0]字符串的地址
5、 二維指針數組行地址相差 列數*4
6、指針數組arr[i][j]==*(&arr[i][j])表示字符串(arr[i][j])中的字符1arr[0][1])的地址
7、數組指針&arr[i][j]=*(arr+i)+j=arr[i]+j,表示字符串arr[i][j])的地址
注:指針數組的數組名計算的是數組中有多少個地址所佔的字節,而不在是元素所佔的地址
8、指針數組:sizeof(arr)計算的是所有地址所佔字節,數組大小爲幾,則地址就有幾個,
9、一維指針數組大小:sizeof(arr)/sizeof(arr[0]);sizeof(1[0])表示一
10、二維指針數組大小:sizeof(arr)/sizeof(arr[0][0]);sizeof(arr[0][0])爲一個地址佔4個字節
代碼講解:
#include<stdlib.h>
#include<string.h>
{
//一個漢字佔4個字節
char * ch="你好";
char ch1[3][5]={"123","你h",{"anv"}};//前一個數3表式字符串個數,後一個數5表式每個字符串最大長度(字符個數-1),包含'\0'
int i=0;
//sizeof(ch1)計算數組可存總字節數大小,
printf("可存字符串個數:%d \n",sizeof(ch1)/sizeof(ch1[0]));//計算數組可存字符串多少
printf("第1個字符串字符數:%d \n",strlen(ch1[0]));//strlen(ch1[i])計算第i個字符串的字符個數不含'\0'
for(i=0;i<3;i++)//對二維數組初始化,(漢字串末尾無隱含'\0',佔1個字節)
{
printf("輸入第%d個字符串:",i);
scanf("%s",ch1[i]);
}
printf("\n********輸出*********\n");
for(i=0;i<sizeof(ch1)/sizeof(ch1[0]);i++)
printf("%s\n",ch1[i]);//ch1[i]表式對第i個字符串輸出
//printf("%s \n",ch1[1][1]);//錯誤,ch1[i]即表式對第i個字符串輸出
printf("ch1[1][1]=%c \n",ch1[1][1]);//ch1[i][j]表式對第i個字符串中的第j個字符輸出,漢字不在ASCLL碼中,不可輸出漢字,
printf("ch=%s\n",ch);
printf("%p \n",&ch1);//表式首地址
printf("%p \n",ch1[0]);//表式第一個字符串地址
printf("%p \n",&ch1[0][0]);//表式第一個字符串的第一個字符地址
printf("%p \n",&ch1[0][1]);//表式第一個字符串的第二個字符地址
printf("%p \n",ch1[1]);//表式第二個字符串地址
printf("可存字符串個數:%d \n",sizeof(&ch1));//一個地址變量所佔字節大小(4)
printf("可存字符串個數:%d \n",sizeof(ch1[0]));//一個字符串所定義字節大小 5
printf("可存字符串個數:%d \n",sizeof(&ch1[0]));//一個地址變量所佔字節大小(4)
printf("可存字符串個數:%d \n",sizeof(ch1[1]));//一個字符串所定義字節大小 5
printf("可存字符串個數:%d \n",sizeof(ch1[0][0]));//一個字符所佔字節 1
printf("可存字符串個數:%d \n",sizeof(&ch1[0][0]));//一個地址變量所佔字節大小(4)
printf("可存字符串個數:%d \n",sizeof(ch1[0][1]));//一個字符所佔字節 1
printf("可存字符串個數:%d \n",sizeof(ch1[2]));//字符串ch1[2]所定義字節大小 5
return 0;
}
四、代碼實例詳解:
#include<stdlib.h>
#include<string.h>
void Ochar_arr(void);//一維數組
void Pchar_arr(void);//指針數組
int main()
{
printf("\n****************一維數組********************\n");
Ochar_arr();//一維數組
printf("\n****************二維數組********************\n");
Tchar_arr();//二維數組
printf("\n****************指針數組**********************\n");
Pchar_arr();//指針數組
system("pause");
return 0;
}
{
//strlen();參數爲數組地址,統計數組中傳入的地址到'\0'之前的元素個數,不包含'\0';數組中無'\0',則返回一個隨機值
//一維數組中只能存放一個字符串,存放字符串時將其拆爲多個字符存放在數組中
//列:char arr3[5]="1a\0A";arr[0]=1;arr[1]=a,arr[2]=\0,arr[3]=A,arr[4]='\0',arr[5]=null;
//字符\0和\n打印出來爲空格和換行而不是\0,\n
char arr[]={'1','a','A'};
char arr1[]={'1','a','\0','A'};
char arr2[]="1aA";//隱含'\0'佔一個字符數組大小爲4,即arr[4]={"1aA"};而不是arr[3]={"1aA"}
char arr3[]={"1a\0A"};//arr[]="1aA"同於arr[]={"1a\0A"}
//數組可用指針訪問
char *parr;
parr=arr;//指向首地址,即&arr[0];
printf("\nchar arr[]={'1','a','A'}\n");
printf("\nchar *parr=arr\n");
printf("arr[0]=%c\n",arr[0]);
printf("*parr=%c\n",*parr);
printf("parr=%p\n",parr);
parr++;//指向下一個地址,即&arr[1];
printf("\nparr++\n");
printf("arr[0]=%c\n",arr[1]);
printf("*parr=%c\n",*parr);
printf("parr=%p\n",parr);
printf("第一個元素地址:%p\n",&arr[0]);//第一個元素地址
printf("第二個元素地址:%p\n",arr+1);//第二個元素地址
printf("arr大小%d\n",sizeof(arr)/sizeof(arr[0]));//3,計算數組大小
printf("strlen(arr)=%d\n",strlen(arr));//隨機值
printf("sizeof(&arr)=%d\n",sizeof(&arr));//4,第一個元素地址所佔字節
//printf("strlen(&arr)=%d\n",strlen(&arr));//隨機值,錯誤表達式
printf("sizeof(&arr[0])=%d\n",sizeof(&arr[0]));//4,第一個元素地址所佔字節
printf("strlen(&arr[0])=%d\n",strlen(&arr[0]));//隨機值
printf("arr1大小%d\n",sizeof(arr1)/sizeof(arr1[0]));//4,計算數組大小
printf("strlen(arr)=%d\n",strlen(arr1));//3,計算數組中元素到'\0'字符之前個數不包含'\0'
printf("arr2大小%d\n",sizeof(arr2)/sizeof(arr2[0]));//4,計算數組大小
printf("strlen(arr2)=%d\n",strlen(arr2));//3,計算數組中元素到'\0'字符之前個數不包含'\0'
printf("strlen(&arr2[0])=%d\n",strlen(&arr2[1]));//2隨機值
printf("\nchar arr3[]={\"1a\\0A\"}\n");// \" 表示打印"
printf("arr3[0]=%c\n",arr3[0]);
printf("arr3[0]=%c\n",arr3[1]);
printf("arr3[2]=%c\n",arr3[2]);//打印空格
printf("arr3[3]=%c\n",arr3[3]);
printf("arr3大小%d\n",sizeof(arr3)/sizeof(arr3[0]));//4,計算數組大小
printf("strlen(arr3)=%d\n",strlen(arr3));//2,計算數組中元素到'\0'字符之前個數不包含'\0'
}
{
char arr[3][3]={{'1','2','3'},{'3','4','7'},{'5','\0','1'}};
//char arr1[2][3]={{"123","abc"},{"ABC"}};//錯誤表達式,不可直接用二維數組存放字符串,應用指針數組
printf("\nsizeof(arr)=%d\n",sizeof(arr));//數組總大小.3*3/1=9,有3*3個元素,字符1個元素佔1個字節
//&arr=&arr[0]=arr+0=&arr[0][0],表示0行0列元素地址
printf("\n&arr=%d\n",&arr);//首地址,0行地址第一個元素地址
printf("sizeof(&arr)=%d\n",sizeof(&arr));//4,計算的是地址所佔的大小,一個地址佔4個字節
printf("sizeof(arr+0)=%d\n",sizeof(arr+0));//4,0行0列元素地址所佔字節所佔的大小,一個地址佔4個字節
printf("&arr[0]=%d\n",&arr[0]);//0行第一個元素地址,即arr[0][0]地址
printf("sizeof(&arr[0])=%d\n",sizeof(&arr[0]));//4,0行0列元素地址所佔字節所佔的大小,一個地址佔4個字節
//&arr[0][j]=arr[0]+j=arr+j=&arr[0][j],0行j列元素地址
printf("\n&arr[0][1]=%d\n",&arr[0][1]);//0行1列元素地址,即arr[0][1]地址
printf("sizeof(&arr[0][1])%d\n",sizeof(&arr[0][1]));//4,0行1列元素所佔字節所佔的大小,一個地址佔4個字節
printf("arr[0]+1=%d\n",arr[0]+1);//0行1列地址,,即arr[0][1]地址
printf("sizeof(arr[0]+1)%d\n",sizeof(arr[0]+1));//4,0行1列元素地址所佔字節所佔的大小,一個地址佔4個字節
//注:二維數組中,i行的地址與i行的第一個元素地址值相同,表示範圍不同
//即*(arr+i)=arr[i]//表示i行地址
//sizeof(arr[0])=sizeof(*(arr+0))//第0行元素所佔字節
printf("\narr[0]=%d\n",arr[0]);//0行地址
printf("sizeof(arr[0])=%d\n",sizeof(arr[0]));//3,第0行元素所佔字節
printf("*(arr+0)=%d\n",*(arr+0));//0行地址
printf("sizeof(*(arr+0))=%d\n",sizeof(*(arr+0)));//3,第0行元素所佔字節
printf("arr+1=%d\n",arr+1);//1行第一個元素地址
//注:字符數組存放字符(一維與二維相同),若無'\0'則用strlen()函數求出的數組大小爲隨機值,有'\0'則求的值爲從傳入遞的地址到第一個'\0'之前的大小
//char arr[3][3]={{'1','2','3'},{'3','5','6'},{'5','\0'}};
//數組該地址起到'\0'之前的大小
printf("strlen(arr[0])=%d\n",strlen(arr[0]));//7
printf("strlen(*(arr+0))=%d\n",strlen(*(arr+0)));//7,arr+1表示0行地址
printf("strlen(arr[1]+0)=%d\n",strlen(arr[1]+0));//4,arr[1]+0表示1行0列地址
printf("strlen(&arr[1][1])=%d\n",strlen(&arr[1][1]));//3,&arr[1][1]表示1行1列地址
printf("strlen(arr[1])=%d\n",strlen(arr[1]));//4,arr[1]表示1行地址
printf("strlen(*(arr+1))=%d\n",strlen(*(arr+1)));//4,arr[1]表示1行地址
printf("strlen(&arr[2][0])=%d\n",strlen(&arr[2][0]));//1,
printf("strlen(*(arr+2))=%d\n",strlen(*(arr+2)));//1,
printf("\n**********************************************\n");
}
{
char arr1[]="123a\0s";//可省去{}
char *arr2[]={"123as"};//指針數組不可省去{}
char *arr3[2]={{"\n1a"},{"123\043"}};
char *arr4[3][2]={{"12345","ABC"},{"abcd"},{"你好"}};//漢字應存儲在字符指針變量或字符指針數組中
//指針數組中使用strlen()計算字符串中字符個數時,會跳過'\0',統計除'\0'的所有字符。非指針數組計算時統計'\0'之前的字符
// '\0和'\n'不可用字符方式輸出打印,輸出爲換行和空格,注:若'\0'後有數字,則還可能輸出其他字符
//數組中的每個字符串都爲一個地址
//數組指針arr[i],表示第i行的地址,即存放arr4[i][0]字符串的地址
//二維數組行地址相差 列數*4
//數組指針arr[i][j]==*(&arr[i][j])表示字符串(arr[i][j])中的字符1arr[0][1])的地址
//數組指針&arr[i][j]=*(arr+i)+j=arr[i]+j,表示字符串arr[i][j])的地址
//注:數組指針的數組名計算的是數組中有多少個地址所佔的字節,而不在是元素所佔的地址
//數組指針:sizeof(arr)計算的是所有地址所佔字節,數組大小爲幾,則地址就有幾個,
//一維數組指針大小:sizeof(arr)/sizeof(arr[0]);sizeof(arr1[0])表示一個地址所佔的字節(4)
//二維指針數組大小:sizeof(arr)/sizeof(arr[0][0]);sizeof(arr[0][0])爲一個地址佔4個字節
printf("\n******************************************\n");
printf("\nchar arr1[]=\"123a\\0s\"\n");// \\0表示打印\0
//printf("arr1[0]=%s\n",arr1[0]);//錯誤表達式 不可用 %s 輸出字符
printf("arr1[0]=%c\n",arr1[0]);//打印第一個字符
printf("arr1=%d\n",sizeof(arr1));//計算數組中所有元素所佔大小大小,包含隱含'\0'
printf("strlen(arr1)=%d\n",strlen(arr1));//arr[0]字符串中'\0'之前的字符個數
printf("arr1[4]=%c\n",arr1[4]);//打印'\0'結果爲空格
printf("\nchar *arr2[]={\"123as\"}\n");
//printf("arr2[0]=%s\n",arr2[0]);//錯誤表達式
//printf("*arr2[0]=%s\n",*arr2[0]);//錯誤表達式
printf("*arr2[0]=%c\n",*arr2[0]);//第一個字符值
printf("arr2[0]=%p\n",arr2[0]);//打印第一個字符串地址
printf("sizeof(arr2)=%d\n",sizeof(arr2));//計算的是所有地址所佔字節(4),數組大小爲幾就有幾個地址
printf("sizeof(arr2[0])=%d\n",sizeof(arr2[0]));//計算的是1個地址所佔字節(4)
printf("sizeof(&arr2)=%d\n",sizeof(&arr2));//計算的是1個地址所佔字節(4)
printf("sizeof(&arr2[0])=%d\n",sizeof(&arr2[0]));//計算的是1個地址所佔字節(4)
printf("sizeof(&(*arr2[0]))=%d\n",sizeof(&(*arr2[0])));//計算的是1個地址所佔字節(4)
printf("strlen(arr2[0])=%d\n",strlen(arr2[0]));//字符串中字符個數
printf("\nchar *arr3[2]={{\"\\n1a\"},{\"123\\043\"}}\n");
//printf("arr3[0]=%s\n",arr3[0]);//錯誤表達式
printf("*(&arr3[0])=%s\n",*(&arr3[0]));//打印第二個字符串,指針可打印字符'\0'
printf("*(&arr3[1])=%s\n",*(&arr3[1]));
printf("arr3[0]=%p\n",arr3[0]);//打印第一個字符串地址
printf("arr3=%d\n",sizeof(arr3));//8,計算數組中所有地址所佔字節
printf("%d\n",strlen(arr3[0]));//arr[0]字符串的字符個數,字符串結尾無\0
printf("%d\n",strlen(arr3[1]));//arr[1]字符串的字符個數,包含字符串中原有的\0
printf("sizeof(arr3)=%d\n",sizeof(arr3));//計算的是所有地址所佔字節,數組大小爲幾就有幾個地址
printf("sizeof(arr3[0])=%d\n",sizeof(arr3[0]));//計算的是1個地址所佔字節(4)
printf("sizeof(&arr3)=%d\n",sizeof(&arr3));//計算的是1個地址所佔字節(4)
printf("sizeof(&arr3[0])=%d\n",sizeof(&arr3[0]));//計算的是1個地址所佔字節(4)
printf("sizeof(&(*arr3[0]))=%d\n",sizeof(&(*arr3[0])));//計算的是1個地址所佔字節(4)
printf("\n************字符串輸出**************\n");
printf("\n char *arr4[3][2]={{\"12345\",\"ABC\"},{\"abcd\"},{\"你好\"}}\n");
printf("*(&arr4[0][0])=%s\n",*(&arr4[0][0]));//打印第一個(arr[0][0])字符串
printf("*arr4[0]+0=%s\n",*(arr4[0]+0));//打印第一個(arr[0][0])字符串
printf("*arr4[0]+1=%s\n",*(arr4[0]+1));//打印(arr[0][1])字符串
printf("*(&arr4[1][0])=%s\n",*(&arr4[1][0]));//打印(arr[1][0])字符串
printf("*arr4[2]=%s\n",*(arr4[2]));//打印(arr[2][0])字符串
//printf("*arr4[0][0]=%s\n",*arr4[0][0]);//錯誤表達式,不可用 %s 輸出
printf("*arr4[0][0]=%c\n",*arr4[0][0]);//打印第一個字符串(arr[0][0])中的第一個字符1
printf("*arr4[0][0]=%c\n",*arr4[0][1]);//打印第一個字符串(arr[0][1])中的第一個字符1
printf("*arr4[0][0]=%c\n",*arr4[2][0]);//打印第一個字符串(arr[2][0])中的第一個字符1(由於漢字不是ASCLL字符,所以打印亂碼)
//printf("arr4[0]=%s\n",arr4[0]);//錯誤表達式
printf("arr4[0]=%p\n",arr4[0]);//打印第0行地址,即存放arr4[0][0]字符串的地址
printf("arr4[1]=%p\n",arr4[1]);//打印第行1地址,與相鄰行地址差 列數*4
printf("arr4[0][0]=%p\n",arr4[0][0]);//第一個字符串(arr[0][0])中的字符1的地址
printf("&(*arr4[0][0])=%p\n",&(*arr4[0][0]));//第一個字符串中的字符1的地址
printf("arr4[0][1]=%p\n",arr4[0][1]);//第二個字符串中的字符1arr[0][1])的地址
printf("&arr4[0][0]=%p\n",&arr4[0][0]);//第一個字符串(&(*arr[0][0]))的地址
printf("*(arr4+0)=%p\n",*(arr4+0));//第一個字符串(&(*arr[0][0]))的地址
printf("*(arr4+0)+0=%p\n",*(arr4+0)+0);//第一個字符串(&(*arr[0][0]))的地址
printf("&arr4[0][1]=%p\n",&arr4[0][1]);//第二個字符串(&(*arr[0][1]))的地址
printf("*(arr4+0)+1=%p\n",*(arr4+0)+1);//第一個字符串(&(*arr[0][1]))的地址
printf("arr4[0]+1=%p\n",arr4[0]+1);//第一個字符串(&(*arr[0][1]))的地址
printf("&arr4[1][0]=%p\n",&arr4[1][0]);//字符串(*(&arr[1][0]))的地址
printf("arr4[1]+0=%p\n",arr4[1]+0);//第一個字符串(&(*arr[0][0]))的地址
printf("*(arr4+0)+2=%p\n",*(arr4+0)+2);//第二個字符串(&(*arr[1][0]))的地址
printf("sizeof(arr4[0][0])=%d\n",sizeof(arr4[0][0]));//字符串(arr[0][0])中的字符1的地址,一個元素地址佔4個字節
printf("sizeof(arr4)=%d\n",sizeof(arr4));//24,地址共佔24個字節
printf("數組大小%d\n",sizeof(arr4)/sizeof(arr4[0])[0]);// 6=24/4 (地址共佔24個字節,一個地址佔4個字節)
printf("strlen(arr4[0])=%d\n",strlen(arr4[0][0]));//字符串a[0][0]的長度
printf("\n******************************************\n");
}