【c/c++】指针的用法(一)
使用指针的目的/好处:
【目录】
【内存空间的访问方式】
【概念剖析】——指针与指针变量
如何定义指针变量
【*与&运算符】——△理解重点
【定义】
指针类型
1.指向常量的指针
编辑2.指针类型的常量
3.void类型的指针
指针变量作为函数参数(地址的传递)
用指针变量做函数参数总结
【内存空间的访问方式】
【概念剖析】——指针与指针变量
一个变量的地址称为该变量的指针(指针本身即地址是unsigned long int型)
用来存放地址(指针)的变量称为指针变量
指针是一个地址,指针变量是存放地址的变量
int x=5;&x //这是指针,变量x的地址叫做它的指针int * temp=&x //temp是变量,是指针变量,存放的是x的地址
如何定义指针变量
【*与&运算符】——△理解重点
* (一元操作符)
指针运算符 “间接访问”运算符
- 与类型名结合共同定义指针变量;(声明语句)
- 表示“指向”,如*pointer_1表示指针变量*pointer_1指向的变量。(执行语句或表达式)
声明语句中——表示声明的是指针
int* p; //声明p是一个int型指针
执行语句或声明语句的初值表达式中——表示访问指针所指对象的内容
cout<<*p; //输出指针p所指向的内容*p=3; //给指针p所指向的对象赋值3
&(一元操作符)
取地址运算符,如 &a 表示 a的地址。
声明语句中——表示声明的是引用
int &p; //声明一个int型的引用p
执行语句或声明语句的初值表达式中——表示取对象的地址
int a,b; int* pa,*pb=&b; //指针pb指向bpa=&a; //指针pa指向a
【定义】
定义指针变量的一般形式为:
数据类型 * 指针变量名;
如:int *pointer_1, *pointer_2;
- int是为指针变量指定的“基类型”
- 基类型指定指针变量可指向的变量类型
- 如pointer_1可以指向整型变量,但不能指向浮点型变量(定义pointer_1为int型)
举例说明如下——
int a=100; int *pointer_1; //*与类型名在一起,共同定义指针变量pointer_1=&a; //&取地址符号,把a的地址赋给指针变量pointer_1 printf(“a=%d\n”,a); printf(“*pointer_1=%d”,*pointer_1); //*与指针变量一起使用,代表指针变量所指向的变量a
指针类型
1.指向常量的指针
声明指向常量的指针,不能通过指针改变所指对象的值,但是指针本身可以改变,可以指向另外的对象;
使用指向常量的指针,可以保证指针所指的常量不被意外改变。

2.指针类型的常量
指针本身的值不能改变,指针指向的内容可变
3.void类型的指针
一般情况下,指针的值只能赋给相同类型的指针,但void类型的指针可以存储任何类型的对象地址,经过使用类型显式转换,通过void类型的指针可以访问任何类型的数据。
指针变量作为函数参数(地址的传递)
通过一个例子来说明:
对输入的两个整数按大小顺序输出。现用函数处理,而且用指针类型的数据作函数参数。
Ø 解题思路:定义一个 swap函数 ,将指向两个整型变量的指针变量作为实参传递给 swap函数的形参指针变量,在函数中通过指针实现交换两个变量的值。
#include int main(){ void swap(int *p1,int *p2); //函数声明 int a,b; int* pointer_1,* pointer_2; //定义两个指针变量 scanf("%d,%d",&a,&b); pointer_1=&a; pointer_2=&b; if (a<b) swap(pointer_1,pointer_2); printf("max=%d,min=%d\n",a,b); return 0; } void swap(int *p1,int *p2) //定义swap函数{ int temp; temp=*p1;*p1=*p2; *p2=temp;}
错误示例(想通过改变指针而不改变变量的形式进行交换),发现只实现了形参之间的改变
而main函数中的实参指针的指向未改变,交换不成功。如下图:
【用指针变量做函数参数总结】
采用指针变量作为函数参数以达到在主调函数与被调函数之间共享多个数据(变量)的本质是实参指针变量与形参指针变量通过形实结合指向了同一个内存单元(地址相同)
这样在被调函数中通过形参指针变量改变了某一内存单元(变量)的值,也相当于实参指针变量所指向的相应内存单元(变量)的值发生了改变。
后续待更新:指针运算、指针与数组、指针与字符串......