美文网首页
电商专业学习嵌入式软件开发第二十二天

电商专业学习嵌入式软件开发第二十二天

作者: 雨打梨花闭门寒 | 来源:发表于2017-02-15 20:33 被阅读0次
    • 预科第十一天

    今天讲的东西不算多,只有字符串和指针与数组的关系两点,但是这两点任何一点拿出来都足够让我琢磨好久了。尤其是指针与数组结合真是伤脑筋,绕不出来。不知道通过练习能不能对这部分内容有所了解。

    26.字符串

    内存分配
    栈区:存储局部变量的数据
    堆区:由程序员malloc出来的空间
    全局区(静态区):全局变量,静态变量
    文字常量区:常量字符串(内容不可更改)
    代码区:二进制代码

    所有的字符串都可以看成字符数组
    字符串:由多个字符构成的集合

     字符串的定义
        char ch[5];
    1.字符串的初始化
        char string[10] = {"hello"};
    2.
        char string2[10] = "hello";
    3.
        char string3[] = "hello";
    4.
        char *p = "hello";
        printf("p = %p\n",p);
        p = "world";
        printf("p = %p\n",p);
    

    printf是打印第一个字符串,\0在字符串当中是一个不显示字符,加上\0代表一个字符串结束

        char *q = "yy";
        char *q1 = "yy";
        printf("q = %p\n",q);
        printf("q1 = %p\n",q1);
    

    计算字符串的实际长度strlen,不包含\0这个字符,要包含头文件#include<string.h>

        char string[] = "hello world";
        long int length = strlen(string);
        printf("%ld\n",length);
    

    拷贝

        char string[10] = "hello";
        char string1[6];
    

    目标字符串的大小>=strlen(源字符串)+1,否则会出现段错误或程序崩掉

        strcpy(string1,string);
        printf("string1 = %s\n",string1); //打印字符串时用%s
    
        char string1[11] = "hello";
        char string2[10] = "world";
        strcat(string1,string2);
        printf("string1 = %s\nstring2 = %s\n",string1,string2);
    

    如果编译器比较低级:string1>string=1,string1<string=-1,string1=string=0;
    如果编译器比较高级:string1<string2=从第一个不同的字母相减,string1>string2=从第一个不同的字母相减,string1=string2=0;

        char string1[10] = "hello";
        char string2[10] = "hgllo";
        //strcompare
        int res = strcmp(string1,string2);
        printf("res = %d\n",res);
    
        char string1[10] = "ha";
        char string2[10] = "h";
        //strcompare
        int res = strcmp(string1,string2);
        printf("res = %d\n",res); //res=97
    
    //拷贝前几个字符串
        char dst[10] = {0};
        char source[20] = "nihaoworld";
        strncpy(dst,source,5);
        printf("dst = %s \n",dst);
    
        //strncat剪切前几个字符
        char dst[20] = "hello";
        char source[10] = "nihaoworld";
        strncat(dst,source,5);
        printf("dst = %s\n",dst); 
    
        //strncmp
        char string1[20] = "hellonihao";
        char string2[20] = "helloworld";
        int res = strncmp(string1,string2,5);
        printf("res = %d\n",res);
    

    16进制:09f
    a b c d e f
    a=10 b=11 ... f=15
    指针和数组的关系

    数组在内存中是一个连续存储的集合
    int array[5] = {1,2,3,4,5};
    &数组名[下标]
      int i;
      for(i = 0;i < 5;i++)
      {
        printf("arr[%d]的地址 = %p\n",i,&array[i]);
      }
    
      int i;
      for(i = 0;i < 5;i++)
      {
        printf("arr[%d]的地址 = %d\n",i,*(array+i));
      }
      printf("arr = %p\n",array + 1);
    
      1>一维数组的数组名就是首元素地址;
      2>如果是某个地址变量+i:实际上是+sizeof(数组元素的类型)*i;
      3>访问第i个元素的地址:
          &array[i] ==========> array+i;
      4>访问第i个元素的值:
          array[i] =========> *(array+i);
    
      如果有下列等式成立:int *p = &array[0];//int *p = array;那么访问第i个变量的地址:p+i===>&p[i];
      访问第i个变量的值:*(p+i)===>p[i];
      array能做的事,p都能做,array不能做的事,p也能做,比如说:array++是错的,p++是可以的
    
      int *p=&array[0];//int *p=array;
      for(i = 0;i < 5;i++)
      {
        printf("arr[%d]=%p\n",i,&p[i]);//p+i
      }
    
      二维数组:由多个一维数组构成的数组
      数据类型 数组名[row][colum];
      二维数组的定义:
        int array[3][4];
      1.初始化
        int array1[2][3] = {{1,2,3},{4,5,6}};
      2.用0补全
        int array2[2][3] = {{1,2},{4,5}};
      3.
        int array3[2][3] = {1,2,3,4,5,6};
      4.行号可以省略,列号不能省
         int array4[][3] = {1,2,3,4,5,6};
      5.
          int array5['a'][3] = {0};
      6.
          int array6[2][3] = {{[1] = 1,[2] = 5},{[1] = 4}};
    
      二维数组元素:数组名[行下标][列下标]
      int array[2][3] = {1,2,3,4,5,6};
      printf("array[1][2] = %d\n",array[1][2]);
    
      int row,colum;
      二维数组的遍历
      for(row = 0;row < 2;row++)
      {
          for(colum = 0;colum < 3;colum++)
        {
            printf("array[%d][%d] = %d ",row,colum,array[row][colum]);
        }
      }
    
    打印空心菱形
                  *
                *   *
              *       *
            *           *
              *       *
                *   *
                  *
      int array[7][13] = {
        {[6] = 1},
        {[4] = 1,[8] = 1},
        {[2] = 1,[10] = 1},
        {[0] = 1,[12] = 1},
        {[2] = 1,[10] = 1},
        {[4] = 1,[8] = 1},
        {[6] = 1}
          };
       int i,j;
       for(i = 0;i < 7;i++)
        {
        for(j = 0;j < 13;j++)
        {
            if(array[i][j] == 1)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }           
        }
        printf("\n");
      }
    
      自定义一个2*3列的整型数组,求其最大值
      int array[2][3] = {{1,3,5},{2,4,6}};
      int max = array[0][0];
      int i,j;
      for(i = 0;i < 2;i++)
      {
        for(j = 0;j < 3;j++)
        {
            max = max < array[i][j] ? array[i][j] : max;
        }
      }
      printf("max = %d\n",max);
    
      int arr[2][3];
      二维数组内存也是连续的
      int i,j;
      for(i = 0;i < 2;i++)
      {
        for(j = 0;j < 3;j++)
        {
            printf("arr[%d][%d]的地址 = %p\n",i,j,&arr[i][j]);
        }
    }
    
    i,j地址:
      a[i]+j ==> &a[i][j] ==> *(a+i)+j;
     i,j值
      *(a[i]+j) ==> a[i][j] ==> *(*(a+i)+j);
     i行0列元素地址:
      &arr[i][0] ==> *(arr+i) ==> a[i] 
        ==> a+i (i行一维数组的地址)
    
        int a;
        int *q=&a;   
        int arr[2][3]={1,2,3,4,5};    
        //先算小括号,代表p这个变量是一个指针变量,再算[],代表将来这个指针指向的是一个大小为3的整型一维数组整体;    
        int (*p)[3];//数组指针
        p=arr;
        /*
         二维数组和指针的关系:
         只要有int (*p)[3]=arr;等式成立,arr能用的情况,p都能用,arr不能用的情况,p也能用
         */
        int i,j;
        for (i=0; i<2; i++)
        {
            for (j=0; j<3; j++)
            {
                printf("arr[%d][%d]=%d\n",i,j,p[i][j]);
            }
        }
    
      指针数组
      int a,b,c;
      先算[]代表他是一个数组,再算*,代表这个数组里面存储的都是指针变量
      int *arr[3] = {&a,&b,&c};
      *(arr[0]) = 9;
      printf("a = %d\n",a);
    

    相关文章

      网友评论

          本文标题:电商专业学习嵌入式软件开发第二十二天

          本文链接:https://www.haomeiwen.com/subject/udoqwttx.html