C语言指针-学习二十二
C语言指针-学习二十二
2022-02-16 / 0评论 / 258阅读 / 0点赞
-- XG.孤梦

C语言指针-学习二十二

XG.孤梦
2022-02-16 / 0 评论 / 258 阅读 / 正在检测是否收录...

地址和指针的概念

如果在程序中定义了一个变量,在对程序进行编译时,系统就会给该变量分配内存单元

  • 内存区的每一个字节有一个编号,这就是“地址”,它相当于旅馆中的房间号。
  • 在地址所标识的内存单元中存放数据,这相当于馆房间中居住的旅客-样。
  • 由于通过地址能找到所需的变量单元,我们可以用地址指向该变量单元,将地址形象化地称为“指针”

3099276210.png

  • 为了表示将数值3送到变量 i 中,可以有两种表达方法:

    • 1.直接存取
    • 例如: i=3;

      • 2.间接存取
    • 例如:*i_ad=3; 其中 *i_ad 表示 i_ad 指向的对象
  • 假设 i_ad 中的值是变量 i 的地址(2000),这样就在 i_ad 和变量 i 之间建立起一种联系,即
    通过 i_ad 能知道 i 的地址,从而找到变量 i 的内存单元
  • 由于通过地址能找到所需的变量单元,因此说,地址指向该变量单元将地址形象化地称为“指针”
    通过它能找到以它为地址的内存单元
  • 一个变量的地址称为该变量的“指针”

    • 例如:地址2000 是 变量 i 的指针
  • 如果有一个变量专门用来存放另一变量的地址(即指针),则它称为“指针变量”
    指针变量就是地址变量,用来存放地址的变量,指针变量的值是地址(即指针)

    • 例如:i_ad 就是一个指针变量

指针变量的定义

  • 一般形式为:

    • 类型 *指针变量名;
  • 例如:

    • int *addr_a, *addr_b;
    • int 是为指针变量指定的 “基类型
    • 基类型指定指针变量可指向的变量类型

    如 addr_a 可以指向整型变量,但不能指向浮点型变量

  • 注意:

    • *addr_a = &a; 错误的
    • addr_a = &a; 正确的
    • float *addr_f;
      addr_f = &a; 错误的,a 为int类型,addr_f 为float类型
  • 例子
通过指针变量访问整型变量。
#include <stdio.h>

void main() {
    int a = 10, b = 100;
    int *addr_a, *addr_b;   // 定义指针变量

    addr_a = &a;    // 使addr_a指同a
    addr_b = &b;    // 使addr_b指同b

    printf("a = %d, b = %d\n", a, b);   // 直接输出 a,b的值
    printf("addr_a = %d, addr_b = %d\n", *addr_a, *addr_b);  // 间接输出 a,b的值
}

43498-qois4qrk8.png


指针变量的引用

  • 在引用指针变量时,可能有三种情况:

    • 1.给指针变量赋值。
    • 例如: p = &a;
  • 2.引用指针变量指向的变量。
  • 例如: p = &a; *p = 1;
  • 引用指针变量的值

    • 例如:printf("%o", p); 以八进制输出a的地址
  • & 取地址运算符

    • &a 是变量 a 的地址
  • * 指针运算符 (“间接访问”运算符)

    • 例如: p 指向变量 a, 则 *p 就代表 a
  • 例子
#include <stdio.h>

void main() {
    int a,b,c,d,e,*p;
    a = 100;
    p = &a;
    b = *&a;
    printf("a=%d\n", a);
    printf("p=%d\n", p);
    printf("*p=%d\n", *p);
    printf("*&a=%d\n", b);
    c = (*p)++;
    printf("(*p)++ = %d\n", c);
    printf("a = %d\n",a);
}

50224-rvbnfd1ftmh.png


#include <stdio.h>

void main() {
    int m, n, *p1 = &m, *p2 = &n, *phint = NULL;
    m = n = 6;
    printf("m=%d,n=%d\n", m, n);
    printf("*p1=%d,*p2=%d\n", *p1, *p2);
    printf("p1=%d,p2=%d\n", p1, p2);
    printf("phint=%d\n", phint);
}

40287-bhlg9f1nacb.png

#include <stdio.h>

void main() {
    int m, n, *p1 = &m, *p2 = &n, *phint = NULL;
    m = n = 6;

    *p1 += 3;
    p2 = p1;
    *p2*=4;
    phint = p2;
    printf("*p1=%d,*p2=%d\n", *p1, *p2);
    printf("p1=%d,p2=%d\n", p1, p2);
    printf("m=%d,n=%d\n", m, n);
    printf("phint=%d\n", phint);
    printf("*phint=%d\n", *phint);
}

42399-9clv5hvhyo.png


0

评论

博主关闭了所有页面的评论