[关闭]
@Arbalest-Laevatain 2018-05-17T12:54:28.000000Z 字数 1136 阅读 561

指针的应用

C语言 C++


高效循环

高效使用数组

使用数组名这一数组首地址来访问数组元素

  1. int a[10];
  2. for (i=0;i<10;i++)
  3. printf("%d ",*(a+i));

使用一个指针来指向数组中的元素

  1. int *p;
  2. for (p=a;p<(a+10);p++)
  3. printf("%d ",*p);

快速输入数据到数组中

  1. for (p=a;p<a+10;p++)
  2. {
  3. scanf("%d",p);
  4. }

引用多维数组

  1. int *p;
  2. int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

可知,a[0]、a[1]、a[2]均是一维数组名,也就是一个指针,所以二维数组名就是指向指针的指针
二维数组的有关指针:(表中的数值只是个例子)

表示形式 含义
a 二维数组名 2000
a[0]、*(a+0)、*a 0行0列的元素的地址 2000
a+1、&a[1] 1行的起始地址 2016
a[1]、*(a+1) 1行0列的元素的地址 2016
a[1]+2、*(a+1)+2、&a[1][2] 1行2列的元素的地址 2024
*(a[1]+2)、*(*(a+1)+2)、a[1][2] 1行2列元素a[1][2]的值 6

注意:
上面有些指针变量虽然值(地址)相同,指向的元素也相同,但是它们的基类型是不一样的
例如:
a+1是 int(*)[4] 类型
a[1]则是 int* 类型

易错点

一、

  1. //*(p++)与*(++p)是不同的

二、

  1. //++(*p)

三、如果p当前指向a数组中的第i个元素a[i],则

  1. //*(p--)相当于a[i--]
  2. //*(++p)
  3. //*(--p) 同理

数组名做函数参数

形参数组名是一个指针变量
而实参数组名则是一个固定的地址

引用字符串

使用字符指针变量和字符数组的比较

1、
2、可以对字符指针变量赋值,但不能对字符数组名进行赋值
3、
4、
5、指针变量的值可以改变,但字符数组名则是一个常量,不可改变

函数指针

函数名即函数的起始地址

函数指针的定义

  1. Elemtype (*指针名)(参数列表);

使用函数指针来调用函数

  1. //max函数的声明
  2. int max(int, int);
  3. //使用函数名调用max函数
  4. c=max(a,b);
  5. //使用函数指针来调用max函数
  6. int *p(int,int);
  7. p=max;
  8. c=(*p)(a,b);

注意:
1、为什么定义指针的时候要加上参数列表?,就是因为这样做可以明确它要指向的函数类型,所以函数指针并不是什么函数都可以指向的,只用同返回值类型以及同参数列表的才行
2、指向函数后,是不能进行算术运算的

函数指针作为函数参数

  1. void fun(int(*x1)(int),int(*x2)(int)
  2. {
  3. }

返回指针值的函数

指针数组

  1. int *p[4];
  2. int(*p)[4];
  3. //这是错的,是是指向一维数组的指针

指针作为main函数的形参

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注