• 指针专题2-数组指针和字符串指针


    1 数组

    int a[5] = {1,2,3,4,5};//在内存中分配5个int类型的内存空间,共4*5=20个字节

    数组名a经常被隐式的转换为指向数组首元素的指针常量

    2 数组指针

      指向数组的指针叫做数组指针。

    int a[5] = {1,2,3,4,5}, *p;
    p=a;

    这时,下面两列取值,取地址操作是等价的。同时应注意&a[i]和&a[i+1]、a+i和a+i+1、&p[i]和&p[i+1]、p+i和p+i+1差值在32位系统中是4,而不是1.

    取地址 取值
    &a[i] a[i]
    a+i *(a+i)
    &p[i] p[i]
    p+i *(p+i)

    2.1 以指针的方式遍历数组元素

    int arr[]={11, 22, 33, 44, 55 };
    int len = sizeof(arr)/sizeof(int);    //求数组长度
    char i;
    for(i=0; i<len; i++)
    {
      printf("%d ", *(arr+i));      //*(arr+i)等价于arr[i]
    }

      arr是int*类型,每次加1时,arr自身的值(地址)会增加sizeof(int)。

    2.2 以数组指针的方式遍历数组元素

    int arr[]={11. 22, 33, 44, 55 };
    int len = sizeof(arr)/sizeof(int), *p=&arr;    //等价于*p=&arr[0]
    char i;
    for(i=0; i<len; i++)
    {
      printf("%d ", *(p+i));      //*(p+i)等价于*(arr+i)
    }

      p、arr、&arr[0] 等价

      *(p+i)、*(arr+i)、arr[i]、p[i ]等价

    2.3 借助自增运算符遍历数组元素

      不管是数组名还是数组指针,都可以用上面的两种方式来访问数组元素,不同的是:数组名是常量,他的值不能被改变;数组指针是变量(除非特别指明它是常量),它的值可以任意改变。也就是说,数组名只能指向数组的开头,而数组指针可以先指向数组开头,再指向其他元素。

    int arr[]={11. 22, 33, 44, 55 };
    int len = sizeof(arr)/sizeof(int), *p=&arr;    //等价于*p=&arr[0]
    char i;
    for(i=0; i<len; i++)
    {
      printf("%d ", *p++);      //*p++等价于*(p++)
    }

      *p++不能改为*arr++,因为arr是常量,而arr++相当于arr=arr+1会改变它的值。

    int *p=&arr[2]

    3 字符串指针

    3.1 字符串指针

    char str[]="https://www.cnblogs.com/Mike2019/";
    char *pstr=str;
    int len=strlen(str), i;
    
    //使用*(pstr+i)或*(pstr++)
    for(i=0; i<len; i++){
         printf("%c", *(pstr++));
    }
    printf("
    ");
    //使用pstr[i]
     for(i=0; i<len; i++){
         printf("%c", pstr[i]);
    }
    printf("
    ");
    
    //使用*(str+i)
    for(i=0; i<len; i++){
        printf("%c", *(str+i));  //这里不能用*(str++),因为str是数组,他是常量
    }
    printf("
    ");
    //使用str[i]
    for(i=0; i<len; i++){
        printf("%c", str[i]);  
    }
    printf("
    ");

    3.2 字符串常量与字符串数组

    (1)字符串常量

    char *str="https://www.cnblogs.com/Mike2019/";  //定义一个字符串常量,存储在内存的静态存储区,所以str所指向地址里的数据是不能被改变的。

    或者

    char *str;
    str="https://www.cnblogs.com/Mike2019/";

    (2)字符串数组

    char str[10] = "hello";  //定义一个字符串数组,存储在动态存储区,数据是可以被改变的

    字符串数组和字符串常量两者的区别是:字符串数组存储在全局数据区或者栈区,字符串常量存储在常量区。也就是字符串常量不可以被修改。

    "hello"其实就是一个常量,在初始化数组的时候出现的"hello"只是一种特殊情况。  

    4 指针数组

      所有元素都是指针的数组叫指针数组。指针数组是多个指针变量,以数组的形式存在内存当中,占有多个指针的存储空间。

    int *p[3];  //定义一个存放着三个指针变量的一维数组
    int a[3][4];
    for(i=0; i<3; i++)
    {
        p[i] = a[i];  //将二维数组每一行首地址指向p[i]
    }
  • 相关阅读:
    含字母数字的字符串排序算法,仿Windows文件名排序算法
    WCF、WPF、Silverlight和区别(转)
    线程组的介绍
    python基础字符串的修改
    c语言
    python 字典
    单元测试相关
    python列表
    如何才能设计出好的测试用例
    字符串查找
  • 原文地址:https://www.cnblogs.com/Mike2019/p/11807398.html
Copyright © 2020-2023  润新知