ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【c++】c语言入门到c++使用高手: c语言入门之指针(二)

【c++】c语言入门到c++使用高手: c语言入门之指针(二)

第九章 指针

第二节 变量的指针和指向变量的指针变量-1

1. 指针变量的定义

  • 变量的指针就是变量的地址,我们可以定义一个指向变量的指针变量,这种指针变量,我们在定义的时候,会引入一个*,在定义的语句中,表示"这是一个指针变量"

  • 指针变量定义的一般形式: 类型标识符 *标识符 ,标识符就是指针变量的名字

inti//普通变量//指针变量定义是,变量名前有个*,这个需要区别int*mypoint;// 定义两个指针变量,这个指针变量,指向整型变量float*mp3;//指向实型变量的指针
  • 如何让整型指针变量指向一个整型变量,可以用赋值语句是一个整型指针变量指向一个整型变量(普通变量)
inti=10;// &是取地址符, 等价与mypoint1指向iint*mypoint=&i;
  • 说明:
  1. 定义指针变量的时候,指针变量前是有*的,表示正在定义一个指针变量,

  2. 但是使用指针变量的时候,指针变量名前是没有*的,指针变量名是mypoint

  3. 一个指针变量只能指向同一个类型的变量(普通变量)

inti=1;floatj=2.0;float*mypoint;mypoint=&i;//错误mypoint=&j;// 正确,类型相匹配

2. 指针变量的引用

  • 牢记: 指针变量中只存放地址,不要将一个整型变量赋值给一个指针变量
int *mypoint = 4;//mypoint是指针变量,而4是整数
  • 指针变量相关的运算符有两个
  1. &: 取地址符, scanf()

  2. *: 指针运算符(间接访问运算符):

a) 乘法运算符, 3*4

b) 定义指针变量的时候我们使用’*',这个叫指针运算符,若这个*不出现在指针运算定义的场合,也不是乘法运算符,那么这个*依旧是指针运算符,只不过代表的是该指针变量所指向的变量

#include<iostream>intmain(){inta=100,b=200;int*p1,*p2;//这里*表示这两个变量是两个指针变量p1=&a;//把变量a的地址赋给了p1,也就是说现在p1指向了ap2=&b;printf("a: %d, b: %d\n",a,b);printf("*p1: %d, *p2: %d",*p1,*p2);//==> *p1 == a, *p2 == breturn0;}
解析(部分常见用法解析)
  • &*p1: 取地址运算符和指针运算符优先级相同,自右至左结合的,所以可以看作&(*p1), (*p1)代表但是p1指向的变量,
    上例中为a, &(*p1)等价与&a,也就是p1.

  • *&a:取地址运算符和指针运算符优先级相同,自右至左结合的,所以可以看作*(&a),上例可以看作*(p1),
    也就等价于p1指向的变量,最终结果等价于a.

intd=*&a;//也就等价于intd=a;
  • (*p)++: *p1是a, 所以等价于a++;

  • *p++: ++和*是同级的,从右到左结合,所以等价于*(p++),

int i=5; i++; // i=i+1 //同理 int *p; //同理,指针变量自加1,也就是变量p中的内容也要自加 //但是具体自加的数值和该指针变量所指向的变量类型有关,如果是整型,则地址增加4,int占4个字节 //意味着p指向下一个变量 *p++
#include<iostream>intmain(){inta=100,b=200;int*p1,*p2;//这里*表示这两个变量是两个指针变量p1=&a;//把变量a的地址赋给了p1,也就是说现在p1指向了ap2=&b;printf("a: %d, b: %d\n",a,b);printf("*p1: %d, *p2: %d\n",*p1,*p2);//==> *p1 == a, *p2 == b// printf("(*p1)++: %d\n", (*p1)++);// 一定要注意这种用法printf("*p1++: %d\n",*p1++);//这里输出还是为100,因为是先输出*p1,然后再将p1的值自加printf("*++p1: %d\n",*++p1);//这里输出是200,p1先自加,再输出;return0;}
  • 指针的互相赋值
#include<iostream>intmain(){// pmax指向大值,pmin指向小值//仅作演示,方法不是最优int*pmax,*pmin,*p,a,b;a=1;b=8;pmax=&a;pmin=&b;if(a<b){p=pmax;pmax=pmin;pmin=p;}printf("pmax: %d, pmin: %d\n",*pmax,*pmin);return0;}
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进