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

  • 预科第十一天

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

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

    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 如果编译器比较高级:string1string2=从第一个不同的字母相减,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);

你可能感兴趣的:(电商专业学习嵌入式软件开发第二十二天)