指针学习 (吉林大学 孙立鑫)

  前言:指针,是一种存储数据地址的特殊变量。

  

目录

  1.变量 变量名 变量地址 变量存储空间的内容

  2.数组指针

  3.数组中的指针常量在等号右端时应进行的操作(重点)

  4.指针数组


 1.  变量 变量名 变量地址 变量存储空间的内容

  首先,何为变量,即在程序运行过程中,值可能发生变化的量。

  我们来声明一个变量。

int i;

  int 说明声明的是整形变量,i是变量名,它有自己的地址。我们可以给它赋值。

  2.数组指针

  我们声明一个数组

int a[2][3][4][5];

 此为四维数组。

  那么数组名a,此时是一个常量,值是数组元素a[0][0][0][0]的地址。

 何为常量(即在程序运行过程中,数值不变的量)(我们也可以用#define 或const声明的形式来声明常量)

 以此类推,a[1]是数组元素a[1][0][0][0]的地址,它也是常量

                   a[1][2]是数组元素a[1][2][0][0]的地址,它也是常量

...............

我们看如下程序(我们申请一个三维数组)

#include<stdio.h>
int main(void)
{
 int a[2][2][2];
 printf("%p\n",a[1][1]);
 printf("%p",&a[1][1][0]);
}

输出结果如下(每次操作结果可能不同)

00000088F30FF800
00000088F30FF800

这也印证了我们的想法

再换个例子依旧如此

#include<stdio.h>
int main(void)
{
 int a[2][2][2][2][2];
 printf("%p\n",a[0][1]);
 printf("%p",&a[0][1][0][0][0]);
}

输出如下

000000F371FFFA60
000000F371FFFA60

再次印证了我们的想法。

3.我们来举一个例子

#include<stdio.h>
int main(void)
{
 int a[2][2][2];
 printf("%p\n",a);
 printf("%p",&a[0][0][0]);
 return 0;
}

0000002B956FFC78
0000002B956FFC78

我们看见常量a 与&a[0][0][0]的值相同,按理说,可以在等号右侧直接使用,但是,重点来了。

#include<stdio.h>
int main(void)
{
	int a[2][2][2];
	int* i;
	i = &a[0][0][0];
	printf("%p", i);
	return 0;
}
000000629552F798

  这样操作没问题 但是如果我们这样操作

 

#include<stdio.h>
int main(void)
{
	int a[2][2][2];
	int* i;
	i = a;
	printf("%p", i);
	return 0;
}

 编译器则会报错。

 这时我们提出一个原则,数组中的指针常量若想在等号右边使用,数组名前的星号数和数组后的中括号数之和必须为维度数-1。

 操作应该为

#include<stdio.h>
int main(void)
{
	int a[2][2][2];
	int* i;
	i = **a;
	printf("%p", i);
	return 0;
}

 补充,因为a为常量,不占用内存,所以&a毫无意义,相当于&a[0][0][0],也相当于a.

 4.指针数组(准确来说是地址数组) 

顾名思义,就是数组中的元素类型是地址的数组。

我们来看一个实例

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
 int *a[10];
 int i=0;
 for(;i<10;i++)
 {
  a[i]=(int*)malloc(sizeof(int));
 }
 i=0;
 for(;i<10;i++)

 {
  printf("%p\n",a[i]);
 }
 return 0;
}

输出结果如下

000002A9DEDC6750
000002A9DEDC62D0
000002A9DEDC6310
000002A9DEDC6110
000002A9DEDC5E50
000002A9DEDC6350
000002A9DEDC6850
000002A9DEDC6190
000002A9DEDC6390
000002A9DEDC6B90

数组中的每个元素存储的都是整型变量的地址。

要注意,stdlib.h中的malloc函数申请变量空间,它对应着有地址,我们通过如下写法

a[i]=(int*)malloc(sizeof(int));

可以把申请到的空间的地址赋值给数组中的每一个元素。

但是可惜的是,malloc只可以申请变量空间,它当然会有一个变量地址,但是却没有一个变量名与之对应。这样也有好处,在链表的学习中,并不需要每个节点都有名字,所以用malloc函数申请空间还是极为合理的。

总结,以上是我对指针学习进行的总结,仅代表我的个人看法,如果我的说法有错误,欢迎指出。

希望以上内容对你的生活和学习有所帮助。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙立鑫 吉林大学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值