c一维数组
数组
一维数组
1.定义
[存储类型](可省略) 数据类型 标识符 [下标] (下标是int的常量或者表达式,不可是变长(根据编译器))
2.初始化
不初始化,值是随机的
部分初始化
全部初始化
static 类型的存储类型
#include <stdio.h> #define M 5 int main(){ static int arr[M]; int i; printf("size =%d\n",sizeof(arr)); for( i=0;i<M;i++){ printf("%p-->%d\n",&arr[i],arr[i]); } } size =20 0x7fff95e22ce0-->0 0x7fff95e22ce4-->0 0x7fff95e22ce8-->4195296 0x7fff95e22cec-->0 0x7fff95e22cf0-->-1780339232 数组的地址是连续的 部分初始化 #define M 5 int main(){ int arr[M]={1,2};//仅仅在声明时这样赋值 int i; printf("size =%d\n",sizeof(arr)); printf("arr=%p\n",arr); for( i=0;i<M;i++){ printf("%p-->%d\n",&arr[i],arr[i]); } } size =20 arr=0x7ffdfae6b0d0 0x7ffdfae6b0d0-->1 0x7ffdfae6b0d4-->2 0x7ffdfae6b0d8-->0 0x7ffdfae6b0dc-->0 0x7ffdfae6b0e0-->0 static类型 地址短了感觉 #define M 5 int main(){ static int arr[M]={1,2}; int i; printf("size =%d\n",sizeof(arr)); for( i=0;i<M;i++){ printf("%p-->%d\n",&arr[i],arr[i]); } } size =20 arr=0x6008f0 0x6008f0-->1 0x6008f4-->2 0x6008f8-->0 0x6008fc-->0 0x600900-->0
3.元素引用
数组名[下标] 0开始
4.数组名
5.数组越界不检查
#include <stdio.h> #define M 3 int main(){ int arr[M]={1,2,3}; int i; printf("size =%d\n",sizeof(arr)); arr[3]=10; printf("%p,arr[3]=%d\n",&arr[3],arr[3] ); for( i=0;i<sizeof(arr)/sizeof(arr[0])+1;i++){ printf("%p-->arr[%d]=%d\n",&arr[i],i,arr[i]); } printf("%p,arr[3]=%d\n",&arr[3],arr[3] ); } --------------------------- 结果 size =12 0x7fff898f52ac,arr[3]=10 0x7fff898f52a0-->arr[0]=1 0x7fff898f52a4-->arr[1]=2 0x7fff898f52a8-->arr[2]=3 0x7fff898f52ac-->arr[3]=3 0x7fff898f52ac,arr[3]=4
对于arr[3]值很诡异
[root@localhost arr]# gdb ./a.out GNU gdb (GDB) Red Hat Enterprise Linux (7.2-83.el6) ..................... (gdb) list 1 #include <stdio.h> 2 #define M 3 3 int main(){ 4 int arr[M]={1,2,3}; 5 int i; 6 printf("size =%d\n",sizeof(arr)); 7 arr[3]=10; 8 printf("%p,arr[3]=%d\n",&arr[3],arr[3] ); 9 for( i=0;i<M+1;i++){ 10 printf("%p-->arr[%d]=%d\n",&arr[i],i,arr[i]); (gdb) 11 } 12 printf("%p,arr[3]=%d\n",&arr[3],arr[3] ); 13 } (gdb) start Temporary breakpoint 1 at 0x4004cd: file ar.c, line 4. Starting program: /mnt/hgfs/www/c/arr/a.out Temporary breakpoint 1, main () at ar.c:4 4 int arr[M]={1,2,3}; (gdb) p arr $1 = {0, 0, 4195296} (gdb) p &arr $2 = (int (*)[3]) 0x7fffffffe500 (gdb) p &arr[0] $3 = (int *) 0x7fffffffe500 (gdb) p &arr[2] $4 = (int *) 0x7fffffffe508 (gdb) p &arr[3] $5 = (int *) 0x7fffffffe50c (gdb) n 6 printf("size =%d\n",sizeof(arr)); (gdb) n size =12 7 arr[3]=10; (gdb) p &i $6 = (int *) 0x7fffffffe50c (gdb) n 8 printf("%p,arr[3]=%d\n",&arr[3],arr[3] ); (gdb) n 0x7fffffffe50c,arr[3]=10 9 for( i=0;i<M+1;i++){ (gdb) p &i $7 = (int *) 0x7fffffffe50c (gdb) n 10 printf("%p-->arr[%d]=%d\n",&arr[i],i,arr[i]); (gdb) n 0x7fffffffe500-->arr[0]=1 9 for( i=0;i<M+1;i++){ (gdb) n 10 printf("%p-->arr[%d]=%d\n",&arr[i],i,arr[i]); (gdb) n 0x7fffffffe504-->arr[1]=2 9 for( i=0;i<M+1;i++){ (gdb) n 10 printf("%p-->arr[%d]=%d\n",&arr[i],i,arr[i]); (gdb) n 0x7fffffffe508-->arr[2]=3 9 for( i=0;i<M+1;i++){ (gdb) n 10 printf("%p-->arr[%d]=%d\n",&arr[i],i,arr[i]); (gdb) n 0x7fffffffe50c-->arr[3]=3 9 for( i=0;i<M+1;i++){ (gdb) n 12 printf("%p,arr[3]=%d\n",&arr[3],arr[3] ); (gdb) n 0x7fffffffe50c,arr[3]=4 13 } (gdb) p i $8 = 4 (gdb) p &i $9 = (int *) 0x7fffffffe50c (gdb) p &arr[3] $10 = (int *) 0x7fffffffe50c 发现arr[3]和i共用一块地址哦
发现arr[3]和i共用一块地址哦
数组作为函数参数时,传进函数的里数组的长度
#include <stdio.h> #include <stdlib.h> int arr[]={2,6,9,0,1}; void p( int arr[]){ printf("%p\n",arr ); printf("sizeof arr in %s :%d\n",__FUNCTION__,sizeof(arr)); } int main(){ printf("%p\n",arr ); printf("sizeof arr in %s :%d\n",__FUNCTION__,sizeof(arr)); p(arr); }
0x600930 sizeof arr in main :20 0x600930 sizeof arr in p :8
在main里arr是一个指针数组,传进p函数之后,传递的参数是指针,sizeof计算的是指针所占的内存空间,一般把数组的长度也传过去
(gdb) start Temporary breakpoint 1 at 0x40050b: file mp.c, line 13. Starting program: /mnt/hgfs/www/c/arr/a.out Temporary breakpoint 1, main () at mp.c:13 13 printf("%p\n",arr ); (gdb) p arr $1 = {2, 6, 9, 0, 1} (gdb) p &arr $2 = (int (*)[5]) 0x600930 (gdb) n 0x600930 14 printf("sizeof arr in %s :%d\n",__FUNCTION__,sizeof(arr)); (gdb) n sizeof arr in main :20 15 p(arr); (gdb) s p (arr=0x600930) at mp.c:7 7 printf("%p\n",arr ); (gdb) p arr $3 = (int *) 0x600930
在main里arr是个指针数组,在p里arr是个纯指针

浙公网安备 33010602011771号