指针的应用


高效循环

高效使用数组

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

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

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

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

快速输入数据到数组中

for (p=a;p<a+10;p++)
    {
        scanf("%d",p);
    } 

引用多维数组

int *p;
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)、*a0行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* 类型

易错点

一、
//*(p++)与*(++p)是不同的

二、
//++(*p)

三、如果p当前指向a数组中的第i个元素a[i],则
//*(p--)相当于a[i--]
//*(++p)
//*(--p) 同理

数组名做函数参数

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

引用字符串

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

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

函数指针

函数名即函数的起始地址

函数指针的定义

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

使用函数指针来调用函数

//max函数的声明
int max(int, int);

//使用函数名调用max函数
c=max(a,b);

//使用函数指针来调用max函数
int *p(int,int);
p=max;
c=(*p)(a,b);

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

函数指针作为函数参数

void fun(int(*x1)(int),int(*x2)(int)
{

}

返回指针值的函数

指针数组

int *p[4];

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

指针作为main函数的形参

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值