C 指针 & 指针变量


一、基本定义

指针:数据在内存中的地址。

指针变量:存放指针的变量,本质上是一个整数。
指针所指向的值,可以是任何类型数据,如数组、字符串、函数或普通变量、指针变量。


二、指针变量使用

1、定义

定义指针变量与定义普通变量非常类似,不过要在变量名前面加星号*

datatype *name;

或者

datatype *name = value;

*表示这是一个指针变量,表示该指针变量所指向的数据的类型 。


int *p1;

p1 是一个指向 int 类型数据的指针变量,至于 p1 究竟指向哪一份数据,由赋予它的值决定。再如:

int a = 100;
int *p_a = &a;

2、多次写入

和普通变量一样,指针变量也可以被多次写入。随时都能够改变指针变量的值。

//定义普通变量
float a = 99.5, b = 10.6;
char c = '@', d = '#';

//定义指针变量
float *p1 = &a;
char *p2 = &c;

//修改指针变量的值
p1 = &b;
p2 = &d;


3、连续定义

指针变量也可以连续定义,注意每个变量前面都要带*

int *a, *b, *c;  //a、b、c 的类型都是 int*

4、 通过指针变量取得数据

指针运算符:*,可以获取指针指向地址里的值。

*pointer;

使用

#include <stdio.h>
int main(){
    int a = 15;
    int *p = &a;
    printf("%d, %d\n", a, *p);  //两种方式都可以输出a的值  15, 15
    return 0;
}

5、修改内存数据

int a = 15, b = 99, c = 222;
    int *p = &a;  //定义指针变量
    *p = b;  // 通过指针变量修改内存上的数据,将 b的值付给了 p 指向地址的值,顾 a = 99
    c = *p;  //通过指针变量获取内存上的数据  
    printf("%d, %d, %d, %d\n", a, b, c, *p); // 99, 99, 99, 99

*p 代表的是 a 中的数据,它等价于 a,可以将另外的一份数据赋值给它,也可以将它赋值给另外的一个变量。


三、* 和 & 小结

1、* 的使用

把地址赋值给指针变量时,p 前面没有 *
将数值 赋值给指针所指向的地址时,p 前面需要 *
如:

int *p;
p = &a;  //  p 前面就不能加*。
*p = 100;

2、 * 和 & 的混合使用

  • *&a可以理解为*(&a)

  • &a表示取变量 a 的地址(等价于 pa)

  • *(&a)表示取这个地址上的数据(等价于 *pa),绕来绕去,又回到了原点,*&a仍然等价于 a。

  • &*pa可以理解为&(*pa)

  • ``*pa`表示取得 pa 指向的数据(等价于 a)

  • &(*pa)表示数据的地址(等价于 &a),所以&*pa等价于 pa


四、指针变量的运算

1、加减

指针变量加减运算的结果跟 数据类型的长度有关

#include <stdio.h>
int main(){
    int    a = 10,   *pa = &a, *paa = &a;
    double b = 99.9, *pb = &b;
    char   c = '@',  *pc = &c;
  
    //最初的值
    printf("&a=%#X, &b=%#X, &c=%#X\n", &a, &b, &c);
    printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
  
    //加法运算
    pa++; pb++; pc++;
    printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
  
    //减法运算
    pa -= 2; pb -= 2; pc -= 2;
    printf("pa=%#X, pb=%#X, pc=%#X\n", pa, pb, pc);
    //比较运算
    if(pa == paa){
        printf("%d\n", *paa);
    }else{
        printf("%d\n", *pa);
    }
    return 0;
}

&a=0X28FF44, &b=0X28FF30, &c=0X28FF2B
pa=0X28FF44, pb=0X28FF30, pc=0X28FF2B

pa=0X28FF48, pb=0X28FF38, pc=0X28FF2C
  
pa=0X28FF40, pb=0X28FF28, pc=0X28FF2A
2686784

不要尝试通过指针获取下一个变量的地址


2、比较

比较的是数据的地址

不能对指针变量进行乘法、除法、取余等其他运算,除了会发生语法错误,也没有实际的含义。

发布了14 篇原创文章 · 获赞 1 · 访问量 981

猜你喜欢

转载自blog.csdn.net/weixin_45390999/article/details/101169761