大一C语言学习笔记---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

Posted 猿头猿脑的王狗蛋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大一C语言学习笔记---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?相关的知识,希望对你有一定的参考价值。

    “指针是C语言的灵魂”这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为。。。。难,真难;下面说一下我对这句话的见解:

    C语言拥有着其他语言所没有的特性---直接访问内存空间,并进行操作,与这个功能对应的工具便是指针。博主刚开始用 DEV-C++ 那段时间嘛,就有时候写着写着系统提醒我有病毒,而且每次都是我用 Dev-C++ 的时候,我就纳闷了,我这用的好好的,怎么会是病毒软件呢?现在我大概明白了,指针会直接操作内存空间嘛,而可以随意进出一台电脑的内存空间,是什么东西?病毒呗!那身为一个小菜鸡,我怎么会那么早就用到指针呢,你还真别说 ,scanf(“%d”,&a)“&”这小玩意你看像不像取地址符(手动狗头);总之C语言的指针既是高效的,又是危险的。我的电脑是这么对我自己敲的代码的:

我一口盐汽水喷死你,我自己写的东西,担心个锤子     (╯°□°)╯︵ ┻━┻


#什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

    第一,指针就是地址,而地址又是什么,举个栗子:一个酒店有很多个房间,每个房间上都有着不一样的房间号,而这些地址就类似于这些房间号;那么每个房间号又是多少位的呢?就32位操作系统而言,每个房间号也就是32位的,“32位”指的是二进制的32位,而1字节代表8位,所以1个地址就占4个字节,而对于 int a=1,尽管我们给变量赋值一位数这么小的数,他在内存单元中依旧是以 32位 储存的,1位数就1位数呗,前面补31个0不就完了;我们可以通过地址来精确地找到房间,这些房间就相当于内存单元,那什么又是内存单元?想要使用变量,就先要在内存中占用一块内存单元,然后才能向内存中储存不同的数据;

举个栗子:  

&88)是地址;

&变量 a)也是地址

    第二,指针变量不同于指针,指针只是地址罢了,而指针变量就是储存地址的一种变量,所以指针变量又叫做地址变量;它也像储存其他数据类型的变量一样,只不过储存的东西是地址;

举个栗子:  

int *qdouble *qchar *q,这些都是指针变量,只不过他们所指向的内存所储存的数据的类型不同罢了;

在定义了 int *q;的前提下,q  就是指针变量;

    第三,取地址符“&”的作用就像它的名字一样,它可以把变量的地址取出来,也可以把88这样的数字等在内存中占用的地址取出来;

举个栗子:

#include<stdio.h>
int main()
{
	int a;
	a=88;
	printf("%d\\n",&a);//这里的&就是把88的地址取出来,并以整型的形式输出
	a=99;
	printf("%d\\n",&a);
	//从这里可以看出,我们虽然对 a 赋了不一样的值,但这并没有改变 a 地址
}

    第四,指针运算符“*”的作用就是根据指针变量所提供的地址来找到“这个地址所对应的内存里放了什么东西”;所以说其实“*”“&”其实就像是两个方向恰好相反的指路牌:“*”是由地址变量指向什么东西,而“&”就是由什么东西指向指针变量;所以说“*”可以读作“地址指向XX”,“&”可以读作“XX的地址”


辅助理解代码:

#include<stdio.h>
int main()
{
	int a;
	a=1;
	printf("%d\\n",a);
	int *q;
	q=&a;
	// q 指向 a  
	printf("%d\\n",*q);
	// *q 就相当于变量 a,所以输出1 
	*q=2;
	printf("%d\\n",*q);
	//“*q=2”等价于“a=2”所以这里会输出2 
	printf("%d\\n",a);
	//同理。这里也输出2 
	
} 

博主水平有限,若文章有错误或不当之处,请狠狠批评博主         (~ ̄(OO) ̄)ブ

C语言笔记初级篇第六章:指针入门

目录

(1)指针是什么

(2)指针和指针类型

A:指针类型

B:指针类型的意义

(3)野指针

A:什么是野指针

B:野指针的起因

C:如何避免野指针

(4)指针运算

A:指针+-整数

B:指针-指针

C:指针的关系运算

(5)指针与数组

(6)二级指针


(1)指针是什么

第一:官方定义

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向 (points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。

第二:基本用法

第三:总结

总的来说:指针就是变量,而它是用来专门存放内存地址的变量指针的大小在32位平台是4个字节,在64位平台是8个字节。

(2)指针和指针类型

A:指针类型

要保存相应类型变量的地址就要定义相应类型的指针

B:指针类型的意义

第一:看似无意义?

如下,对于一个整形变量,使用int* 指针和char*指针都能正确保存其内容,那么区分这么多类型是否就没有意义呢

第二:实例说明

于是我们可以得知,指针类型决定了指针进行解引用操作时,能够访问的空间大小。比如char* 只能访问1个字节,于是他只修改int的一部分。

同时,指针的类型决定了指针向前向后走一步能有多大距离(这个距离就是字节)

第三:指针与数组的关系的再说明

前面说过,数组名其实就是数组首元素的地址。所以数组名就直接可以赋值给指针。下面的数组中有10个元素,为int型数组,每一个元素4个字节,数组长40个字节。用指针可以将他们的元素全部变为1。为了验证上面的说法,先定义int*的指针去操作

接着我们定义char*指针去操作int数组,看下是否和前面说的char*指针解引用时只能移动一个字节,同时这次我们用内存窗口观察

(3)野指针

A:什么是野指针

野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

B:野指针的起因

第一:指针没有初始化

局部变量没有初始化,会被设为默认值,但是指针没有初始化会是一个随机值

第二:指针越界访问

上面数组和指针实例中,指针不能一直加到数组范围之外,否则就成了一个野指针了

第三:指针指向的空间释放

这一点在动态内存中会讲到,下面的代码运行结果正确,但是本质是错误的

C:如何避免野指针

1:指针初始化

指针在创建时,尽量初始化,让其指向某一片地址。如果实在不知道指向什么,可以设置为空指针

 

2:小心指针越界

3:释放指针指向的空间时,及时将指针置为NULL

4:使用指针之前坚持其有效性

(4)指针运算

A:指针+-整数

可以用来访问数组

B:指针-指针

指针变量p1减p2的意义为: 

如果是正值 , 则表示在内存中p1比p2靠后

如果是负值 , 则表示 在内存中 p1比p2靠前

结果的数字表示 , 两个地址在内存中间隔多少个指针类型的字节倍数 。

C:指针的关系运算

上述写法是标准写法,当然从运行角度上讲也可以写成下面这样

 

从可读性上讲很好,但是这样会导致最终比较时比较到数组前面去了,而C语言规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与指向第一个元素之前的那个内存位置的指针进行比较

 

(5)指针与数组

指针与数组的基本关系前面已经叙述的很多了。这里主要说几个案例

(6)二级指针

如下,p指针保存a变量的地址,pp指针保存p指针的地址。pp指针解引用的内容就是a的地址。

当然所涉及的操作依然是相似的

以上是关于大一C语言学习笔记---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?的主要内容,如果未能解决你的问题,请参考以下文章

C语言笔记初级篇第六章:指针入门

C语言笔记进阶篇第一章:指针进阶

C语言笔记进阶篇第一章:指针进阶

C语言指针就应该这么学 - 指针的进阶篇

C语言进阶学习笔记二指针的进阶(练习篇)

[学习笔记]C语言中关于指针的详解1