c语言数组的相关运算

来源:互联网 发布:九阴真经女性捏脸数据 编辑:程序博客网 时间:2024/06/05 05:15

1.首先分别介绍一下sizeof、strlen

    (1)sizeof是一个单目操作符,所以内部的表达式不参与运算,它求取一个类型所创建变量的空间,sizeof后如果是类型必须加括号,如果是变量可以不加,一般都会带上括号。

    (2)strlen是个函数,作用是计算给定的字符串长度,不包括'\0',返回字符串的长度,不包括结束符NULL。

2.sizeof、strlen的区别与联系

    (1)sizeof可以用类型、函数做参数,strlen只能用char*做参数,且必须是以'\0'结尾的。

    (2)sizeof的求值在编译期间执行,strlen的结果在运行的时候计算出,它用来计算字符串的长度,不是类型占内存的大小

3.以程序为例具体说明sizeof、strlen并且求数组大小

#define _CRT_SECURE_NO_WARNINGS int main(){char *p = "abcdef";        printf("%d\n", sizeof(p));//4    p是个指针变量,存着a的地址        printf("%d\n", sizeof(p+1));//4      指向下一个字符b的地址        printf("%d\n", sizeof(*p));//1       *p访问的是a字符        printf("%d\n", sizeof(p[0]));//1      访问的也是a字符        printf("%d\n", sizeof(&p));//4 //取出p的地址,与字符abcdef无关,与他们的地址有关,而存的是a的地址        printf("%d\n", sizeof(&p+1));//4         取p地址的下一个空间        printf("%d\n", sizeof(&p[0]+1));//4     取出a的地址+1就是b的地址了printf("%d\n", strlen(p));//6 从a的地址向后找是六个字符printf("%d\n", strlen(p+1));//5 //p字符指针+1向后跳一个字符,即从b开始数是五个字符printf("%d\n", strlen(*p));//错误  把a的ASCII值当做地址查找无法访问出错printf("%d\n", strlen(p[0]));//错误  把a的ASCII值当做地址查找无法访问出错printf("%d\n", strlen(&p));//随机值/*从p的空间开始向后找,而p里面存的是字符a的地址,把地址拆分成一个一个往后数,不确定里面内容,无法预测*/printf("%d\n", strlen(&p+1));//随机值 /*指向的p的下一个空间 同理无法预测*/printf("%d\n", strlen(&p[0]+1));//5 /*&p[0]取出a的地址+1往后跳一位是b,数到f*/int num = 10;        char *p = (char *)#printf("%d\n", sizeof(p));//4printf("%d\n", sizeof(*p));//1  p是char *的一个指针,所以应该是一个字节字符数组  '0'---48  '\0'---0   0   NULL数值也为零,但它专门初始化指针char arr[] = "abcdef";//char arr[] = {'a','b','c','d','e','f',0};printf("%d\n", strlen(arr));//6printf("%d\n", strlen(arr + 0));//6  数组中字符的长度printf("%d\n", strlen(*arr));//错误   把首元素当做地址处理,访问出错printf("%d\n", strlen(arr[1]));//错误  把首元素当做地址处理,访问出错printf("%d\n", strlen(&arr));//6 //取地址数组名是取数组的地址,从起始位置数到\0是6printf("%d\n", strlen(&arr + 1));//随机值 //+1跳过了这个数组到了\0后面,所以不确定printf("%d\n", strlen(&arr[0] + 1));//5 //从元素第二个字符b数到\0是5printf("%d\n",sizeof(arr));//7   六个字符和一个\0printf("%d\n",sizeof(arr+1));//4   首元素地址加1,是第二个元素的地址,还是地址printf("%d\n",sizeof(*arr));//1  arr是首元素地址解引用是首元素,是char型printf("%d\n",sizeof(arr[0]));//1  首元素printf("%d\n",sizeof(&arr));//4  数组首元素地址的大小printf("%d\n",sizeof(&arr+1));//4 第二个元素地址的大小printf("%d\n",sizeof(&arr[0]+1));//4 指向b,地址char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };printf("%d\n", strlen(arr));//随机值 //arr表示首元素地址,从a往后数,没有字符结束标志/0,所以不确定printf("%d\n", strlen(arr+0));//随机值printf("%d\n", strlen(*arr));//错误//*arr表示首字符a,而a是97,strlen存地址而把97当做地址被访问可能找不到printf("%d\n", strlen(arr[1]));//错误  同理printf("%d\n", strlen(&arr));//6  取出数组的地址相当于首元素地址printf("%d\n", strlen(&arr+1));//&arr数组的地址+1跳过整个数组,后面不确定  printf("%d\n", strlen(&arr[0]+1));//5  第一个元素地址+1到第二个元素地址,开始往后数printf("%d\n", sizeof(arr));//6   求的是数组大小,//每个元素是一个字节,六个元素六个字节printf("%d\n", sizeof(arr + 0));//4  首元素地址 printf("%d\n", sizeof(*arr));//1 首元素的一个字符printf("%d\n", sizeof(arr[1]));//1 第二个字符printf("%d\n", sizeof(&arr));//4 数组的地址printf("%d\n", sizeof(*&arr));//6 解引用整个数组printf("%d\n", sizeof(&arr + 1));//4 跳过整个数组,到f后面printf("%d\n", sizeof(&arr[0] + 1));//第二个元素的地址一维数组int a[] = { 1, 2, 3, 4 };printf("%d\n", sizeof(a));//16printf("%d\n", sizeof(a + 0));//4printf("%d\n", sizeof(*a));//4printf("%d\n", sizeof(a + 1));//4   指针  第二个元素的地址printf("%d\n", sizeof(a[1]));//4  第二个元素的大小printf("%d\n", sizeof(&a));//4  首元素地址printf("%d\n", sizeof(*&a));//16 整个数组的地址printf("%d\n", sizeof(&a + 1));//4  取地址a后一个printf("%d\n", sizeof(&a[0]));//4   首元素地址printf("%d\n", sizeof(&a[0]+1));二维数组int a[3][4] = { 0 };//三行四列十二个整型元素printf("%d\n", sizeof(a));//48 数组名表示整个大小 12*4printf("%d\n", sizeof(a[0][0]));//4 首元素为整型printf("%d\n", sizeof(a[0]));//16 第一行的数组名printf("%d\n", sizeof(a[0]+1));//4 第一行第二个元素的地址printf("%d\n", sizeof(a+1));//4 第一行的地址+1第二行的地址printf("%d\n", sizeof(&a[0]+1));//4 /*第一行的取地址+1第二行地址,&a[0]+1是第二行第一个元素地址*/printf("%d\n", sizeof(*a));//16/*数组名为数组首元素地址降级为一维数组地址,解引用是一维数组*/printf("%d\n", sizeof(a[3]));//16  并没有访问a[3],sizeof内部表达式不参与运算//只是看到a[i],就判断为i行地址//表达式有两个属性:值属性;类型属性//int a=1;//int b=2; a+b     a+b为3,3是值属性,int+int是int整型是类型属性}



0 0
原创粉丝点击