有关指针,结构体,数组的总结

有关指针,结构体,数组的总结

一级指针

*p和p的区别以及如何定义指针

首先理解一个语句

i_pointer=&i;

*i_pointer表达的是指针所指的对象就是你输入i变量的数值。
i_pointer有一个具体的值,这个值就是地址也就是&i…

那么如何定义指针呢?
再看一个语句 int *pointer_1,*pointer_2;

就是定义了两个指针
可见,虽然这里也用到了*的符号,但他表示的并不是上面所说的表示变量的数值。

所以:int *pointer_1中的pointer_1为指针变量
i_pointer为指针
区分好指针变量和指针的区别

大概的理解就是,指针变量他是一个变化的指针,你可以把指针理解为门牌号,指针内容理解为门里面的内容。
而上面所说的指针变量就是一个变化的门牌号

同样的char *pointer_1也可以表示一个指针,但是这个叫做指针变量的基类型

基类型表示的是可以指向变量的类型,比如说,你想找一个指针指向数字和字符是不一样的。

指针和数组之间的关系

我们先理解一下下面三句话

int *p;
p=&a[0];
p=a;

上面的效果是完全一样的。
为什么呢?
首先,第二行的意思是a[0]表达的是一个数字,那么对他取地址然后赋值给p
第三行的意思是,a这个数组的第一个元素的地址赋值给a
所以我们可以总结得

已知一个数组a[n],a代表的就是这个数组第一个元素所对应的地址

那么我们如何通过指针来引用数组的元素呢?

上面我们说到

int *p;
p=&a[0];
p=a;

我们如果对p+1其实就是a[1]这个元素的地址
引用的话就直接用*解运算符来得到指针对应的内容

*(p+i);

这个就是引用数组的内容。

数组名和函数参数

首先看一下这个语句

void(int arr[],int n);
fun(arrar,10)

还记得上面是怎么用指针做函数参数的么?

void swap(int *p1,int &p2);
swap(p1,p2);

是不是觉得两个其实非常像?
没错!

我们可以看到。
在定义函数的时候,括号里面都是指针变量
在用函数的时候,都是把指针放进去

但其实程序在编译的时候,是将arr指针当作变量来处理其实就是

void(int arr[],int n);
等价于
void fun(int *arr,int n);

由int arr[]==int *arr,我们可以得出一个结论

数组的本质就是一个指针(在计算机处理数组的时候)

指针和多维数组的关系

我们先看一个二维数组

int a[3][4]={
{1,3,5,7}
{9,11,13,15}
{17,19,21,23}
};

1 3 5 7
9 11 13 15
17 19 21 23
从二维数组来看a代表的是二维数组首元素的地址
但是现在的首元素不是一个简单的整型元素
而是一个由4个整形元素所组成的一维数组。

所以a代表的是首行(即序号为0的行的)首地址。

表达形式含义地址
a二维数组的组名,第0行的首地址2000
a+1,&a[1]第一行的首地址2000
a[0],*(a+0),*a0行0列的元素的地址2016
a[1],*a+1第1行第0列的地址2016
a[1]+2,* (a+1)+2,&a[1][2]第1行第2列的地址2021
* (a[1]+2),* (*(a+1)+2),a[1][2]第1行第2列的数值元素值为13

还有一个东西你要注意的是,一个int型的指针变量,相差一个位置,就是加4,但是现在这个地方,一行有四个元素,所以相差了16

–end of the article–
明天早上再把结构体还有多重指针总结一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值