一级指针*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),*a | 0行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
|