數組總結及其實例詳解

一、一維數組
定義:類型名 數組名[數組大小] ;注:數組大小不可是變量,只可是數字或宏定義值
列: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<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()

 //一個漢字佔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);//ch1表式首地址
 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));//數組所佔總字節大小 15
 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
 system("pause");
 return 0;
}


四、代碼實例詳解:


#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Tchar_arr(void);//二維數組存放字符
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;
}
void Ochar_arr(void)//一維數組
{
 //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("\n首地址:%p\n",arr);//首地址,即第一個元素地址
 printf("第一個元素地址:%p\n",&arr[0]);//第一個元素地址
 printf("第二個元素地址:%p\n",arr+1);//第二個元素地址
 printf("\nchar arr[]={'1','a','A'}\n");
 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("\nchar arr1[]={'1','a','\\0','A'}\n");//  \\0 表示打印 \0
 printf("arr1大小%d\n",sizeof(arr1)/sizeof(arr1[0]));//4,計算數組大小
 printf("strlen(arr)=%d\n",strlen(arr1));//3,計算數組中元素到'\0'字符之前個數不包含'\0'
 printf("\nchar arr2[]=\"1aA\"\n");
 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'
}
void Tchar_arr(void)
{
 char arr[3][3]={{'1','2','3'},{'3','4','7'},{'5','\0','1'}};
 //char arr1[2][3]={{"123","abc"},{"ABC"}};//錯誤表達式,不可直接用二維數組存放字符串,應用指針數組
 printf("char arr[3][3]={{'1','2','3'},{'3','4','7'},{'5','\\0','1'}}\n");
 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("\narr+0=%d\n",arr+0);//0行第一個元素地址,即arr[0][0]地址
 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("\narr[1]=%d\n",arr[1]);//1行地址
    printf("arr+1=%d\n",arr+1);//1行第一個元素地址
 printf("\n&arr[1][1]=%d\n",&arr[1][1]);//1行1列元素地址
 printf("\n*********************************\n");
 //注:字符數組存放字符(一維與二維相同),若無'\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");
}
void Pchar_arr(void)
{
   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("\n******************************************\n");
   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("\n******************************************\n");
   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("\n*************字符輸出****************\n");
   //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("\n******************************************\n");
   //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])=%d\n",sizeof(arr4[0]));//8,arr4[0]表示行地址,一行地址共佔8個字節,
   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");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章