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是个纯指针

 

posted @ 2017-12-25 13:33  H&K  阅读(174)  评论(0)    收藏  举报