数组和指针2 const sizeof strlen 在数组和指针中的应用

1.什么是数组?
 一块连续的内存,相同类型数据的集合
 数组名:数组收首元素的首地址。
2.二级指针
   int a=10;
   int *p=&a;
   *p=30;
   int**p2=&p;
   **p2=1000;
   printf("%d %d %d",*p,**p2,a);  此时值都为1000,*表示间接引用,哟个*一次解引用。
3.字符数组字符串
     %s:打印字符串,遇到\0,0才停止.
     %c:打印字字符
     char arr1[10] = {'a','b','c','d','e','f'};默认后面有\0;字节数为10
     arr1[0] = 'g';
     printf("arr1 == %s\n",arr1);           //打印gbcdef
     char str[] = "abcdef";                     //默认后面有0 字节数为7
     char str2[7] = "abcdef";                 //有'\0', 字节数为7
     char arr2[6] = {'a','b','c','d','e','f'};  //字节数为6, 没有'\0'打印结果为abcdef烫烫烫烫烫abcde因为%s只有遇到'\0'才停                                                                    止,就会找扫上一个数组的'\0',只有遇到'\0'才会停止
     printf("%s\n",arr1);//abcdef     
     printf("%s\n",str);//abcdef
     printf("%s\n",str2);//abcdef
     printf("arr2 == %s\n",arr2);//abcde
4.只读数据
   (1) char *str3="abcdef";
            *str3='g';                   //此时str这个变量存储在栈上,str所指向的数据存储在只读段(readonlydate),只读段的数据
                                                只能读取不能更改 不能拷贝。
   (2) char *str="hello";
             char *str1="world";
             str=str1;                    //只读数据不能被赋值。
             printf("%s %s",*str,*str1);
5.字符串常量 const
    (1)   char *str="abcdef";    //字符串常量
    (2)   const
           const int b=20;
           b=30;                     //此时运行这两句会报错const定义的变量叫常变量,必须定义的同事赋值,一旦赋值不能被改变。
           const int b=30;
   (3)   定义指针变量时const离谁近修饰谁
          const char *str2 = "hello";               //离*近,str里面的内容不能改变 *str2
          char const *str2="hello";                //离*近,str里面的内容不能改变 *str2
          char  * const str2 = "hello";            //str的指向不能改变 
6.断言
      头文件为#include<assert.h>
      assert(表达式)  断定表达式为真
     可以准确找到错误,断言仅在debug(开发)版本下生效,relese版本无效。
7.数组在什么时候确定大小?什么时候分配内存?数组最大分配多大内存?
           数组在编译的时侯确定大小,运行的时候分配内存,数组在栈上存储,栈的大小一般为一兆或者两兆,所以数组最大分配    的内存不超过一兆或者两兆
8.strlrn的返回值是无符号的,所以不能用差值。
7.    sizeof  strlen
       sizeof 求字节数,包含'\0',strlen 求字符串长度,不包含'\0',遇到'\0'停止。
    (1) char *str = "hello";
              char str2[10] = "abcde";
              printf("str ==%d,%d\n",sizeof(str),strlen(str));       //4(任何指针变量字节数都是4)5
              printf("str2 == %d,%d\n",sizeof(str2),strlen(str2));//10(数组大小) 5
    (2 )char str[100] = "abcdef";
              char str2[] = "abcdef";
              char *str3 = "abcdef";
              char str4[100] = "abcdef\0xyz";
              char str5[] = "abcdef\0xyz";
              char *str6 = "abcdef\0xyz";
              char str7[] = "abcdef\n\0";
              char *str8 = "abcdef\n\0";
              printf("str == %d,%d\n",sizeof(str),strlen(str));              //100  6
              printf("str2 == %d,%d\n",sizeof(str2),strlen(str2));        // 7     6
              printf("str3 == %d,%d\n",sizeof(str3),strlen(str3));        //4      6
              printf("str4 == %d,%d\n",sizeof(str4),strlen(str4));        //100  6
              printf("str5 == %d,%d\n",sizeof(str5),strlen(str5));        //11    6
              printf("str6 == %d,%d\n",sizeof(str6),strlen(str6));        //4      6
              printf("str7 == %d,%d\n",sizeof(str7),strlen(str7));        //9      7
              printf("str8 == %d,%d\n",sizeof(str8),strlen(str8));        //4      7
    这里需要注意几点:
    1.求sizeof包含后面默认的字节零,如果字符串内本身也有字符零 当普通字符计算 后面依旧包含默认的
    字符零.
    2.用sizeof求数字长度时可以越界,因为sizeof是关键字,关键字求值是在编译时。
    3.求strlen 不包含字符零且遇到字符零就停止.
    4.任何指针变量的字节数都是4.
阅读更多
上一篇数组和指针1
下一篇几种实现(strcpy)字符串拷贝函数的方法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭