2021-12-1学习笔记

8:00~12:00:上课;
12:00~14:00:吃饭、休息;
14:00~17:00:写作业、学指针;
19:00~21:30:刷题;
刷题数:3;

指针归纳总结:

一维指针:
1、一个变量有地址,一个数组包含若干元素,每个数组元素都有相应的地址;
2、指针变量可以指向数组元素(把某一元素的地址放到一个指针变量中);
3、所谓数组元素的指针就是数组元素的地址;
 

int a[3]={0,1,2};
int *p;
p=&a[0];

注意:数组名a不代表整个数组,只代表数组首元素的地址。“p=a;”的作用是“把a数组的首元素的地址赋给指针变量p”,而不是“把数组a各元素的值赋给p”。

在指针指向数组元素时,允许以下运算:
1、加一个整数(用+或+=),如p+1
2、减一个整数(用-或-=),如p-1
3、自加运算,如p++,++p
4、自减运算,如p--,--p
5、两个指针相减,如p1-p2 (只有p1和p2都指向同一数组中的元素时才有意义)
注意:相加无意义;

如果指针变量p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,p-1指向同一数组中的上一个元素。
float a[10],*p=a;
假设a[0]的地址为2000,则
p的值为2000
p+1的值为2004
P-1的值为1996

通过指针引用数组元素:
引用一个数组元素,可用下面两种方法:
1、下标法,如a[i]形式;
2、指针法,如*(a+i)或*(p+i);
其中a是数组名,p是指向数组元素的指针变量,其初值p=a;

#include"stdio.h"
int main()
{
int a[4]={1,3,5,7};
int *p=a;
printf("%d",*(p+1));
}

运行结果: 3

用数组名作函数参数:
实参数组名是指针常量,但形参数组名是按指针变量处理
在函数调用进行虚实结合后,它的值就是实参数组首元素的地址
在函数执行期间,形参数组可以再被赋值

int a[N];
max(a);

//函数首部定义应为
void max(int a[N])
//或
void max(int a[])
//或
void max(int *a)

 

多维数组:

通过指针引用多维数组:

请看如下代码: 

#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"math.h"
int main()
{
int a[3][4]={{1,3,5,7},
     {9,11,13,15},{17,19,21,23}};
int (*p)[4]=a;//p++移动4*sizeof(int);
int *q=a[0];//q++移动1*sizeof(int);
printf("%d\n",*(*(p+1)+0));//相当于a[1][0]
printf("%d",*(q+1));//相当于a[0][1]
}

运行结果:

9

为什么会出现这种情况呢? 因为p++移动4*sizeof(int)相当于a[1][0];而q++移动1*sizeof(int)相当于a[0][1];如下图所示


a代表第0行首地址;
a+1代表第1行首地址;
a+2代表第2行首地址;

 

a[0]代表a[0][0]的地址;
a[0]+1代表a[0][1]的地址;
a[0]+2代表a[0][2]的地址;
a[0]+3代表a[0][3]的地址;

用指向数组的指针作函数参数
一维数组名可以作为函数参数,多维数组名也可作函数参数。
用指针变量作形参,以接受实参数组名传递来的地址。

int a[M][n];
max(a);

//函数首部应该为:
void max(int arr[N][N])
//或
void max(int arr[][N])//系统不检查形参一维的大小;
//或
void max(int (*arr)[N])


可以有两种方法:
1、用指向变量的指针变量;
2、用指向一维数组的指针变量;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值