C/C++指针类型难点笔记

背景:我对C/C++指针类型的认识到目前仍停留在本科学习C语言的水平上,当时也只是在课堂上听听,没有认真思考琢磨过,更没有在实战项目中用过该知识点,以至于对指针类型现在可以说是不会!网上有很多博客介绍指针,但个人觉得,由于博主表述水平限制和知识点本身晦涩难懂,所以学习该部分知识点还是选择权威教材最为合适。

我将谭浩强编著的《C++程序设计》中的指针部分研读理解。只对部分易混淆,易遗忘的知识点在此做一记录,方便日后查看。该部分内容重在理解,不能去记忆。

1 定义指针变量

int *pointer_1,*pointer_2;
//定义指针变量 *pointer_1,*pointer_2
//注意:指针变量名是pointer_1,pointer_2,定义指针变量时在变量名前加* 只是表示该变量是指针变量
//开头的int 表示指所定义的指针变量是指向整型数据的指针变量,或者说*pointer_1,*pointer_2中只能存放整形数据的地址,int就是指针变量的基类型

2 区分指针变量与指针

int *pointer_1, i=1;//定义基类型为int型的指针变量pointer_1 和 int型变量i

pointer_1 = &i;//让指针变量pointer_1指向i,即将变量i 的地址赋值给pointer_1

cout << "*pointer_1 = " << *pointer_1 << endl;//输出*pointer_1的值,1

(1)在定义一个指针变量pointer_1的时候在前面加 * 只表示该变量是个指针变量;如int *pointer_1;

(2)指针变量pointer_1的值是 i 的地址 &i。注意:指针变量的值是地址,不能理解为指针变量是地址

(3)变量i的地址&i 就是变量i的指针。牢记“地址即指针”。

(4)定义完指针变量pointer_1之后,使用该变量有两种方式:pointer_1和*pointer_1,前者的值是地址,后者的值是这个地址中存放的数。

3 指针作为函数参数

指针做函数参数的应用在Yolov3源码中十分普遍。它的作用是将一个变量的地址传送给被调用函数的形参

//定义一个被调用的函数,形参为指针变量(指针作为函数参数)
void swap(int *p1,int *p2)
{//函数的作用是将 *p1的值与 *p2的值交换
  int temp;
  temp = *p1; //此时*p1表示指针变量p1指向的地址中存放的数
  *p1 = *p2;
  *p2 = temp;
  
}

//定义主函数去调用上面的这个函数
int main()
{
  int *pointer_1, *pointer_2, a=3, b=4;//定义指针变量pointer_1,pointer_2,int型变量a,b
  pointer_1 = &a;//使pointer_1 指向a
  pointer_2 = &b;
  //调用swap函数使 *pointer_1与 *pointer_2值互换
  swap(pointer_1,pointer_2);调用swap函数,实参pointer_1,pointer_2分别是变量a,b的地址,将其传给形参
  return 0;

}

调用函数swap(pointer_1,pointer_2)将a,b的地址传给形参之后,

p1 = pointer_1 = &a, p2 = pointer_2 = &b

*p1 = a = 3, *p2 = b = 4

指针变量做函数参数接收数组地址

即形参是个指针变量,实参是数组地址

//定义一个被调用函数,用指针变量做形参
void select_sort(int *p, int n)
{//函数作用:将10个整数进行顺序排列
  //函数体代码
  return 0;
}

//定义一个主函数调用上述函数
int main()
{
  int a[10], i;
  for (i=0: i<10; i++)
  {
    cin >> a[i];
  }

  select_sort(a,10);//函数调用,数组名作实参,表示将数组元素a[0]的地址传给形参
  return 0;
}

函数调用后,形参接收a[0]的地址,即 p = &a[0], *p = a[0]

5 指针函数——返回指针值的函数

一个函数可以带回(即被调用后返回)一个int值、float值、char值等,也可以带回指针型的数据,即带回一个地址。

//定义指针函数
int *a(int x,int y)//a 是函数名,int是类型
{
  //函数体代码
  return 0;
}

调用上面的指针函数后带回的是一个指向整形数据的指针(整形数据的地址)。

指针即地址!!!

6 指向指针的指针(也常被叫做二级指针)

6.1 要理解指向指针(数据)的指针,必须先理解指针数组

指针数组的每个元素均为指针数据,即每个元素的值都是一个地址。

char *name[] = {"BASIC","FORTRAN","C++","PYTHON"}; //定义指针数组

[ ]的运算级别比*高,所以name先与[ ]结合组合成数组,name[ ]再与*结合组成*name[ ] 。

以上定义了指针数组name,它有4个元素,初始值分别是字符串“BASIC”, “FORTRAN”, “C++”, “Basic” 的起始地址。

须注意这里的初值是字符串的起始地址,而不是字符串本身!!!                    

指针数组             字符串

name[0]  ——>  BASIC

name[1]  ——>  FORTRAN

name[2]  ——>  C++

name[3]  ——>  PYTHON

6.2 指向指针的指针

char * *p; //定义指向指针数据的指针变量,与 char *(*p)写法等价

char * *p是常见写法,为便于理解,将其视为char *( *p)写法。

课本分析过程:先分析 char * p, 显然是定义p为指向字符型数据的指针变量。然后在(*p)的前面又加了一个 * 号,成了 char * (*p), 表示p指向的是字符指针数据,*p 就代表p所指向的字符指针

个人理解:char * p,定义p为指向字符型数据的指针变量,即p 的值是字符型数据的地址(指针变量的值是地址)。

                    char * (*p) , 就表示这个地址中存放的数(是个字符数据)

char * *p;//定义指向字符指针(数据)的指针变量p

char *name[] = {"BASIC","FORTRAN","C++","PYTHON"}; //定义指针数据name,每个数组元素name[i]相当于一个指针变量,都可指向一个char型变量

p = name + 2; //使p 指向name[2],即p的值是name[2]的地址,是个地址,。此时 *p 就代表name[2],是个数

cout << *p << endl; //输出name[2],即C++
cout << **P << endl;//输出name[2]的首字符,即C


白话理解:p 是个地址, *p 是这个地址中存放的字符串, * *p是这个字符串的第一个字符。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值