C中关于数组以及数组的简单运算

来源:互联网 发布:文艺复兴 知乎 编辑:程序博客网 时间:2024/05/20 00:49

1.如何创建一个数组

通常我们创建数组使用来储存程序所需要的数据。
数组创建的一般格式为:类型标识符 数组名[常量表达式]。
eg:我们要创建一个包含十个数的整形数组,我们可以创建为int arr[10],其中长量表达式部分可以包括常量,常变量和符号常量,但不能包含变量。

2.关于数组的初始化

eg:arr[4]={0};
arr[4]={1,2,3};
arr[4]={1,[2]=2,3};
如上所示,我们用花括号括起来,以逗号将值分隔起来来初始化数组。上式1是将数组中4个元素都赋值成了0;上式2将数组的第一,二,三隔元素分别赋值成了1,2,3,即a[0]=1,a[1]=2,a[2]=3,其余元素默认赋初值为0。上式3是将a[0]=1,a[2]=2,a[3]=,其余元素默认赋初值为0。我们可以看到,可以在初始化列表中使用带方括号的下标指明待初始化的元素(当然这个前提这个程序是在支持C99的编译器下)。

3.关于数组的sizeof运算

对于sizeof,如果它内部单独存放数组名,则数组名表示的是整个数组,sizeof计算的是数组的总大小。下面我将举例说明:
首先我们定义一个数组:int a[]={1,2,3,4};

    printf("%d\n", sizeof(a));  //16 数组名单独放在sizeof内部表示的是整个数组,所以是计算整个数组的大小,一个int占4个字节,所以4*4=16    printf("%d\n", sizeof(a+0));  //4 数组名不是单独放在sizeof内部,所以表示的是数组首元素的地址,(a+0)表示的是数组第一个元素的地址,地址的大小为4个字节    printf("%d\n", sizeof(*a));  //4 数组名表示的是数组首元素的地址,*a代表数组首元素,大小为4个字节     printf("%d\n", sizeof(a+1));  //4 数组第二个元素      printf("%d\n", sizeof(a[1]));  //4 数组第二个元素,相当于*(a+1)    printf("%d\n", sizeof(&a));  //4 数组名表示首元素的地址,再取地址,遍历整个数组,数组的地址大小为4个字节    printf("%d\n", sizeof(*&a));  //16 &a表示整个数组的地址,*&a表示整个数组的大小    printf("%d\n", sizeof(&a+1));  //4 跳过整个数组后面的地址,4 个字节    printf("%d\n", sizeof(&a[0]));  //4 第一个元素的地址    printf("%d\n", sizeof(&a[0]+1))//4 第二个元素的地址

强调一点,地址都是4个字节的大小
接下来我们定义一个字符型数组,加深一下理解.
char a[]={‘a’,’b’,’c’,’d’,’e’,’f’,}

    printf("%d\n", sizeof(a)); //6 整个数组的大小    printf("%d\n", sizeof(a+0)); //4 数组首元素的地址    printf("%d\n", sizeof(*a));  //1 数组首元素,char类型大小为一个字节    printf("%d\n", sizeof(a[1]));  //1 第二个元素    printf("%d\n", sizeof(&a)); //4 整个数组的地址    printf("%d\n", sizeof(*&a)); //6 整个数组的大小    printf("%d\n", sizeof(&a+1)); //4 跳过整个数组的下一个数组的地址    printf("%d\n", sizeof(&a[0])); //4 第一个元素的地址    printf("%d\n", sizeof(&a[0]+1)) //4 数组第二个元素的地址

char a[]=”abcdef”

    printf("%d\n", sizeof(a)); //7 数组的大小,包括‘\0’    printf("%d\n", sizeof(a+0)); //4 第一个元素的地址    printf("%d\n", sizeof(*a));  //1 首元素    printf("%d\n", sizeof(a[1]));  //1 第二个元素    printf("%d\n", sizeof(&a));  //4 整个数组的地址    printf("%d\n", sizeof(*&a));  //7 整个数组的大小    printf("%d\n", sizeof(&a+1));  //4 跳过整个数组的下一个数组的地址    printf("%d\n", sizeof(&a[0]));  //4 第一个元素的地址    printf("%d\n", sizeof(&a[0]+1)) //4 第二个元素的地址

char *p=”abcdef”

    printf("%d\n", sizeof(p)); //4 指针变量大小为4 个字节    printf("%d\n", sizeof(p+1)); //4 指针变量等价于地址,对地址加1还是地址    printf("%d\n", sizeof(*p)); //1 第一个字符的大小    printf("%d\n", sizeof(p[0])); //1  等价于*(p+0),表示第一个字符的大小    printf("%d\n", sizeof(&p)); //4 表示p的地址    printf("%d\n", sizeof(&p+1)); //4 p的下一个地址    printf("%d\n", sizeof(&p[0]+1)); //4 第二个字符的地址

4.关于数组的strlen运算

strlen用来计算字符串s的长度(其中s为无符号整型),不包括’\0’,即遇到’\0’为止。
首先我们定义一个字符型数组char a[] = { ‘a’,’b’,’c’,’d’,’e’,’f’ }

    printf("%d\n", strlen(a)); //随机值 因为无结束标志'\0',函数会一直查下去在未知的地方遇到'\0'并报值    printf("%d\n", strlen(a+0)); //随机值 同1)    printf("%d\n", strlen(*a)); //error 首元素'a'的ASCII值为97,从97开始向后找,97不是一个有效的地址值    printf("%d\n", strlen(a[1])); //error 同上    printf("%d\n", strlen(&a)); //随机值,从首元素地址向后找,无技术标志    printf("%d\n", strlen(&a+1)); //随机值 从整个数组后开始找,随机     printf("%d\n", strlen(&a[0]+1)); //随机值 从数组第二个元素地址开始查找

char a[]=”abcdef”

    printf("%d\n", strlen(a)); //6 字符串的长度,不包括'\0'    printf("%d\n", strlen(a+0)); //6 从第一个字符开始数,遇到'\0'为止    printf("%d\n", strlen(*a)); //error *a=*(a+0)=a[0],'a'对应的ASCII值为97,不是一个有效的地址     printf("%d\n", strlen(a[1])); //error a[1]表示第二个元素的地址,'b'的ASCII码值为98,不是一个有效的地址    printf("%d\n", strlen(&a)); //6 表示整个数组的地址,即a[0]的地址,从a[0]的地址开始找'\0'    printf("%d\n", strlen(&a+1)); //随机值 跳过了整个数组,包括'\0'    printf("%d\n", strlen(&a[0]+1)); //5 从arr[0]的地址开始找'\0' 

char *p=”abcdef”

    printf("%d\n", strlen(p)); //6 内存放首字符地址,遇到'\0'为止    printf("%d\n", strlen(p+1)); //5 从第二个字符开始,遇到'\0'为止    printf("%d\n", strlen(*p)); //error'a'的ASCII值地址传入后,非法访问    printf("%d\n", strlen(p[0])); //error 同上    printf("%d\n", strlen(&p)); //随机值 从第一个字符当中的地址开始查找,'\0'不确定找到      printf("%d\n", strlen(&p+1)); //随机值 从第二个字符当中地址开始查找,'\0'不确定找到    printf("%d\n", strlen(&p[0]+1)); //5 从第二个字符开始查找,遇到'\0'为止

关于数组的sizeof和strlen运算就和大家分享到这了。如有错误,希望大家可以指正。本篇所写程序都是在32位的电脑下运行的,统一使用的是vs2015编译。

1 0