C语言中有关一维数组的一些运算

来源:互联网 发布:儿童怎么学英语 知乎 编辑:程序博客网 时间:2024/05/16 09:46

在学习C语言一维数组有关计算中,有关sizeofstrlen的的计算我们必须掌握!

一、sizeof

有两种情况出现时,在运算中代表整个数组:

(1)当数组名arr单独放在sizeof()内部时,即:sizeof(arr);单位字节

(2)当数组名arr单独放在&后面时,即:&a;

除以上两种情况外,其余情况都代表数组首元素的地址。

二、strlen

strlen()用于计算指定字符串的长度,它会从数组首元素的地址开始一直找下去,直至遇到结束字符“\0”时停止,在计算长度时不包括"\0"。

下面我们通过以下例子来掌握此类计算(其中 整型int 大小为四个字节,字符型char 大小为一个字节):

例一:

#include<stdio.h>int main(){int arr[] = { 1, 2, 3, 4 };//  4个元素printf("%d\n", sizeof(arr));//16  数组名单独放在sizeof内部时表示整个数组printf("%d\n", sizeof(arr+0));//4  数组首元素的地址加0,仍然代表数组首元素的地址printf("%d\n", sizeof(*arr));//4  数组首元素的大小printf("%d\n", sizeof(arr+1));//4  数组首元素地址加1,表示数组第二个元素的地址printf("%d\n", sizeof(arr[1]));//4  数组第二个元素的大小printf("%d\n", sizeof(&arr));//4  数组首元素的大小printf("%d\n", sizeof(*&arr));//16  数组指针解引用来管理整个数组的大小,此处相当于sizeof(arr)printf("%d\n", sizeof(&arr+1));//4  跳过整个数组arr之后的数组地址大小printf("%d\n", sizeof(&arr[0]));//4  数组首元素的地址printf("%d\n", sizeof(&arr[0]+1));//4  数组第二个元素的地址return 0;}
例二:

#include<stdio.h>int main(){char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };//  6个元素(该数组无'\0')printf("%d\n", sizeof(arr));//6  整个数组的大小printf("%d\n", sizeof(arr+0));//4  数组首元素地址加0,仍表示数组首元素的大小printf("%d\n", sizeof(*arr));//1  数组名代表数组首元素的地址,数组首元素的地址解引用,代表数组首元素的大小printf("%d\n", sizeof(arr[1]));//1  第二个元素的大小printf("%d\n", sizeof(&arr));//4  数组首元素的大小printf("%d\n", sizeof(&arr+1));//4  跳过整个数组之后的下一个元素大小指向f的后面printf("%d\n", sizeof(&arr[0]+1));//4  第二个元素的地址printf("%d\n", strlen(arr));//随机值  由于该数组无'\0'printf("%d\n", strlen(arr+0));//随机值  数组首元素加0,表示从数组第一个元素开始printf("%d\n", strlen(*arr));//X  *arr表示数组首元素,即'a',也就是从地址为97开始找,但由于97是一个未知的地址,不允许访问,程序会报错printf("%d\n", strlen(arr[1]));//X  本题和上题出现了同样的错误,从'b'之后开始找,程序会报错printf("%d\n", strlen(&arr));//随机值  从数组首元素开始一直找下去 printf("%d\n", strlen(&arr+1));//随机值  跳过整个数组开始,一直找下去,和上题相差6  printf("%d\n", strlen(&arr[0]+1));//随机值  数组第二个元素b的地址开始,一直找下去  return 0;}
例三:

#include<stdio.h>int main(){char arr[] = "abcdef";//7个元素(该数组有'\0')printf("%d\n", sizeof(arr));//7  整个数组printf("%d\n", sizeof(arr+0));//4  数组名代表数组首元素的地址,加0仍然是数组首元素的地址printf("%d\n", sizeof(*arr));//1  数组名代表数组首元素的地址,数组首元素的地址解引用代表数组首元素printf("%d\n", sizeof(arr[1]));//1  数组第二个元素bprintf("%d\n", sizeof(&arr));//4  数组首元素的地址printf("%d\n", sizeof(&arr+1));//4  跳过整个数组后的下一个元素地址printf("%d\n", sizeof(&arr[0]+1));//4  数组第二个元素b的地址printf("%d\n", strlen(arr));//6  整个数组元素个数,遇'\0'停止,不计算'\0'printf("%d\n", strlen(arr+0));//6  从数组第一个元素开始printf("%d\n", strlen(*arr));//X  *arr表示数组首元素,即'a',也就是从地址为97开始找,但由于97是一个未知的地址,不允许访问,程序会报错printf("%d\n", strlen(arr[1]));//X  本题和上题出现了同样的错误,从'b'之后开始找,程序会报错printf("%d\n", strlen(&arr));//6  从数组首元素开始,遇'\0'停止printf("%d\n", strlen(&arr+1));//随机值  跳过整个数组后,到数组结束的个数printf("%d\n", strlen(&arr[0]+1));//5  从数组第二个元素开始,到数组结束的个数  return 0;}