• C基础--初学指针


    一、指针简介(任何指针变量在内存中占八个字节的存储空间)

    1.定义指针变量(格式):变量类型 *变量名;--定义一个指向整形变量的指针  int *p;

    2.作用:指针变量就是用来存储其他变量的地址;--int a=10;

      //指针将变量a的地址赋给指针变量p

      p = &a;//&是取地址符号,数组有两种方法获得内存中的地址--例:

      方法1:数组的变量名就是数组内存中的地址

      //定义一个int类型的数组

      int ages[2] = {10, 20 };//将数组的地址赋给指针变量p

      p = ages;  或者  p = &ages;

      方法2:数组中的第一个的地址就是该数组的地址--定义变量之后,在内存中开辟存储空间是从大到下寻地址,存放变量时,是在开辟的空间中,从小到大分配地址

      p = ages[0];

      图解:只是为了讲解,内存地址有地方不对

    3.访问:

      指针变量中存入了某个变量的地址后,,可以通过地址来访问或者改变地址中的变量,方式:

      *p = 11;

    二、指针注意点:

    1.任何指针变量都占用8个字节的存储空间

    2.指针类型只能指向对应类型的变量,比如int *p只能指向int类型的数据,不然会出错

    3.指针是用来存储地址的,不要随便赋值一个变量。例如:

      float *p1 ; p1 = 100 ;--这是错误写法

    4.float f =1.5f ;

      float *p = &f ;//这一句代码其实做了2件事--1)定义了指针变量p;2)让指针变量p指向了f

      *p = 5.6f ;

    三、指针和数组

    利用指针遍历数组元素,方法一:这种遍历方式,指针的值从未变过

     1 void test3()
     2 {
     3     int ages[4] = {10, 11, 56, 47};
     4     
     6     int *p = ages;
     7     
     8     //p + 1; // &ages[1]
     9     //p + 2; // &ages[2]
    10     //p + 3; // &ages[3]
    11     //p + i; // &ages[i]
    12     
    13     for (int i = 0; i<4; i++)
    14     {
    15         int num = *(p + i);
    16         printf("ages[%d]=%d
    ", i, num);
    17     }
    18     
    19     // 这种遍历方式,指针的值从未变过
    20     printf("%d
    ", *p);
    21     
    22 }

    利用指针遍历数组元素,方法二:这种遍历方式,指针的值一直在改变

     1 void test5()
     2 {
     3    int ages[4] = {10, 11, 56, 47};
     4     
     5    int *p = ages;
     6     
     7     for (int i = 0; i<4; i++)
     8     {
     9         printf("ages[%d]=%d
    ", i, *p);
    10         p++;
    11         // p = p + 1;
    12     }
    13     
    14     // 这种遍历方式,指针的值一直在改变
    15 }

    四、详解指针的p+1

    1.指针变量的+1并不是基本数据类型中简单的+1;

    2.p+1究竟是增加了多少,取决于指针的类型;

      指针的p+1跟指针所指向的数据类型有关,如下:

      char *    1

      int *       4

      double *    8

      long *    8

    五、指针与字符串:重点--char *name = "hello" ;-->不可改变(可以理解为字符串常量)        char name[] = "hello" ;-->可以改变(可以理解为字符串变量)

    1.利用数组存储的字符串是可变的

     1 void test1()
     2 {
     3     int a;
     4     
     5     // 利用数组存储的字符串是可变的
     6     char names[] = "itcast";
     7     
     8     //char names[] = {'i', 't', 'c', 'a', 's','t', ''};
     9     
    10     char *p = names;
    11     
    12     *(p + 3) = 'A';
    13     
    14     //printf("%s
    ", p + 2);
    15     
    16     printf("%s
    ", names);
    17 }

    2.直接利用 指针变量指向的字符串,是不可变的

     1 void test2()
     2 {
     3     // names这个指针变量指向了字符串的首字符'i'
     4     // 直接利用指针变量指向的字符串,是不可变
     5     char *names = "itcast";
     6     char *names2 = "itcast";
     7     
     8     // names和names2指向的是同一个字符
     9     printf("names=%p
    ", names);
    10     printf("names2=%p
    ", names2);
    11 }

    3.学习指针之前的字符串存储

      char name[] = "hello" ;

      char names[2][10] = { "hello" , "world" };

    4.学习指针之后的字符串存储:

      char *name = "hello" ;

      //指针数组:数组里面装的元素是指针

      //整形数组:数组里面装的元素是整型数据

      char *names[2] = { "hello" , "world" } ;

  • 相关阅读:
    CCF NOI1032 菱形
    CCF NOI1031 等腰三角形
    CCF NOI1030 角谷猜想
    CCF NOI1029 信息加密
    CCF NOI1028 判断互质
    CCF NOI1027 数字之和
    CCF NOI1026 表演打分
    CCF NOI1025 统计奖牌
    CCF NOI1024 因子个数
    CCF NOI1023 最大跨度
  • 原文地址:https://www.cnblogs.com/gchlcc/p/5127076.html
Copyright © 2020-2023  润新知