指针与数组

2021-10-08  本文已影响0人  lxr_
//当指针指向数组元素的时候,可以对指针变量进行加减运算,如*(p+n),且支持[]运算符,如p[n]
//此时指针p+n指向原来指针p后面第n个元素p[n],而不是简单的将地址加一,而是加了数组中每个元素类型所占字节大小,p[n]=*(p+n)
//不一定需要通过定义指针指向数组来访问数组中的元素,数组名本身就是数组首地址
//可以使用字符指针定义字符串,用[](下标)访问字符串**

#include <stdio.h>
#include <string.h>
   
int main(int argc, char** argv)
{
    char a[] = "helloworld";
    char* p = a;

    printf("*p=%c,*(p+2)=%c,p[2]=%c\n", *p, *(p + 2), p[2]);  //*p=h,*(p+2)=l,p[2]=l
    printf("p:%p,p+1:%p\n", p, p + 1);//p:009DF6E4,p+1:009DF6E5  //相差一个字节,每次运行结果可能不一样
                      //由于该指针指向char类型数组,数组每个元素占一个字节,故p+1指向下一个元素的同时地址也加一

    int b[] = { 1,2,3 };
    int* pp = b;  //指针指向b数组
    printf("*pp=%d,*(pp+2)=%d,pp[2]=%d\n", *pp, *(pp + 2), pp[2]);  //*pp=1,*(pp+2)=3,pp[2]=3
    printf("pp:%p,pp+1:%p\n", pp, pp + 1); //pp:00AFFA98,pp+1:00AFFA9C    //相差sizeof(int)=4个字节大小

    printf("*b=%d,*(b+2)=%d,b[2]=%d\n", *b, *(b + 2), b[2]);        //*b=1,*(b+2)=3,b[2]=3   //与使用定义的指向数组的指针访问数组一样
    
    char* str = "helloworld";  //使用一个字符指针指向字符串常量,其实指向的是第一个字符'h'
    printf("*str=%c\n", *str);//*str=h
    int i, length;

    length = strlen(str);
    for (int i = 0; i < length; i++)
    {
        printf("%c", str[i]);
    }
    printf("\n");
    
    //统计字符串中字符个数
    char s[] = "helloworld";
    int count = 0;

    //while (*s++ != '\0')  //出错,因为字符串s的“helloworld”存储区常量区,s是常量不可修改
    //{
    //  count++;
    //}
    
    //修改如下
    char* ps = s;  //定义一个指针指向字符串“helloworld”,但此时ps是变量可修改
    while (*ps++ != '\0')  //++优先级高于*
    {
        count++;
    }

    printf("有%d个字符\n",count);  //有10个字符

    //指针数组(是数组)和数组指针(是指针)
    //int* p[](指针数组) 和int (*p)[](数组指针)   []优先级高于* 
    //如int* p[]中p[]首先是一个数组,数组中的元素类型为int* ,故为指针数组
    //int (*p)[]中首先(*p)定义其为一个指针,指向一个数组,数组重元素类型为int

    //********指针数组**********
    int m = 0, j = 1, k = 2;
    int* pa[3] = { &m,&j,&k };

    for (int i = 0; i < 3; i++)
    {
        printf("%p  %d\n", pa[i],*pa[i]);  //012FF820  0  存放的每个元素的地址,根据地址可找到对应的数
                                           //012FF814  1
                                           //012FF808  2
    }
    
    char* pStr[3] = { "hello",
                      "world",
                      "xian" };  //相当于实现二维数组

    for (int i = 0; i < 3; i++)
    {
        printf("%s\n", pStr[i]);   //hello
                                   //world
                                   //xian
    }

    //********数组指针**********(指向整个数组,而不是指向数组的第一个元素,与前面 int*pp=b区别开来)
    int tmp[3] = { 1,2,3 };
    int(*ap)[3] = &tmp;  //取得数组地址   因为数组名表示整个数组,本身就是地址,要指向整个数组,就需要指向这个地址,类似于二级指针
    //int(*ap)[3] = tmp;  //这样也可以,因为数组名就是数组的地址(&tmp==tmp),也是数组第一个元素的地址, 不建议这样写(与指向数组的指针int*p区别开)
    for (int i = 0; i < 3; i++)
    {
        //ap为& tmp,* ap为tmp,(*ap + i)指向数组第i个元素
        printf("%d\n", *(*ap + i));   //   1      
                                      //   2
                                      //   3     
    }

    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读