分享

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

 印度阿三17 2019-07-03

一级指针

*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–
明天早上再把结构体还有多重指针总结一下

来源:https://www./content-4-296101.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多