數組 數組是一系列相同類型元素有序的集合。 數組的定義: 一般形式為: 類型符 數組名 [常量表達式] 如 int a[5]; 表示數組有五個元素,a[0]-a[5],不存在元素a[5]。 *註意: 1.常量表達式中可以包含常量和符號常量,如“int a[3+5];" 2.c語言不允許對數組的大小作 ...
數組
數組是一系列相同類型元素有序的集合。
數組的定義:
一般形式為: 類型符 數組名 [常量表達式] 如 int a[5]; 表示數組有五個元素,a[0]-a[5],不存在元素a[5]。
*註意: 1.常量表達式中可以包含常量和符號常量,如“int a[3+5];"
2.c語言不允許對數組的大小作動態定義。
//列如,下列對數組的定義是不合法的:
int n;
scanf("%d",&n);
int a[n];
//這段代碼在Visual c++中編譯會報錯,但在dev c++ 和 gcc中不會,能夠正常運行!
//但是在被調用的函數中定義的數組,其長度可以是變數或非變數表達式 如:
viod fun(int n)
{
int a[n*2];
}
數組的初始化:
通過查閱書籍,搜索資料,收集到如下初始化方式:
int a[5]={0,1,2,3,4};
// a[0]=0, a[1]=1, a[2]=2, a[3]=3, a[4]=4
char ch[]
int a[5]={0,1}; //只對一部分元素賦值
// a[0]=0, a[1]=1, a[2]=0 a[3]=0 a[4]=0
int a[5]={0}; //全部元素賦值為0;
// a[0]=0, a[1]=0 a[2]=0 a[3]=0 a[4]=0
int a[]={0.1.2.3.4} //知道元素個數,不指定數組長度
// a[0]=0, a[1]=1, a[2]=2, a[3]=3, a[4]=4
char ch[5]={"hello"};
char ch[5]="hello";
char ch[10]={'h','e','l','l','\0'};
//這裡不要忘記為最後的,'\0'分配空間。如果要初始化一個字元串"hello",那為它定義的數組至少有6個數組元素,但是如果忘記了,一些編譯器會自動補充
int a[5];
for(i=0;i<5;i++)
{
a[i]=i;
}//使用for迴圈賦值
//使用memset給數組賦指定的ASCLL值
char a[10];
memset(a,0,strlen(a)); //全部賦值為0
用法:void *memset(void *s, int ch, int size_t n)
數組的大小和長度:
sizeof(數據類型)*元素個數
sizeof(數組名)
int a[5];
sizeof(a); //此時a代表的是數組名,而不是數組的首地址 所以大小為20,而不是4;
malloc函數動態分配數組長度
int main(){ int len;
printf("輸入分配的數組長度:len= ");
scanf("%d,&len");
int * pArr = (int *)malloc(sizeof(int)*len);
*pArr = 4; //類似於a[0] = 4;
pArr[1] = 10; //類似於a[1] = 10,指針的數組用法
*(pArr+2)=20; //通過+1操作賦值
printf("%d %d %d", *pArr, pArr[1],*(pArr+2));
free(pArr);
return 0;
}
len=5時,便使用malloc函數分配20個位元組,並強制轉換成int類型的地址,malloc函數只返回第一個位元組地址,通過+1操作獲取後面的地址。
使用free(pArr)釋放記憶體。數組的地址: 1.a與&a
雖然a=&a,在值上看起來相等,也都表示數組的首地址,我們通過+1操作來瞭解它們的區別。
int a[10]={0,1,2,3,4,5,6,7,8,9}; printf("a[0]_size=%d\n",sizeof(a[0])); //數組元素的大小 printf("a_size=%d\n",sizeof(a)); //數組的大小 printf("a=%p\n",a); printf("a+1=%p\n",a+1); printf("&a=%p\n",&a); printf("&a+1=%p\n",&a+1); return 0;
a:它的類型是int* 所以它+1的步長為數組元素大小的位元組數,也就是4個位元組,a+1就是a[1]的地址。
&a:它的類型數int *[10] 所以它+1的步長為數組大小的位元組數,也就是40個位元組,&a+1就是a[10]的地址(a[10]已經越界了)。
2.a[0]與&a[0]
int a[10]={0,1,2,3,4,5,6,7,8,9}; printf("a[0]_sizeof=%d\n",sizeof(a[0])}; printf("a[0]=%d\n",a[0]); printf("a[0]+1=%d\n",a[0]+1); printf("&a[0]=%p\n",&a[0]); printf("&a[0]+1=%p\n",&a[0]+1);
a[0]:數組中的元素,值為0,a[0]+1=1。
&a[0]:數組首元素的地址,其值與a和&a相同,它的類型為int *,所以它+1的步長為數組元素大小的位元組數,也就是4個位元組,&a[0]+1就是a[1]的地址。
數組的使用方式
1.數組形式
2.指針形式
int a[5];
a[0]=0; //數組形式
*(a+1)=1; //指針形式
修改數組內容的彙編過程:
1.通過數組名找到首地址;
2.根據地址的偏移量,找到需要修改元素的地址
3.修改內容
希望大家多多提點一下。