学习笔记---初识指针

41 篇文章 0 订阅
26 篇文章 0 订阅
本文介绍了C语言中的指针概念,强调了初始化指针的重要性,禁止给未初始化或赋予特定整数值的指针变量赋值。通过示例解释了如何通过指针访问变量值,并探讨了`const`关键字对指针变量的影响。
摘要由CSDN通过智能技术生成

变量与变量指针:

变量:

当定义一个变量,系统即赋予其对应的内存空间。变量的数据类型将影响变量得到的内存的大小

如:

int 型变量的字节数为4,因此当定义一个int 型变量时。系统将随机的取4个连续的内存单元作为该变量的存储空间。

比如 

int i =100;
float f=2.3;
 char c='k'; 

 

 

 

内存中可能这样给这几个变量分配空间:

这些内存单元都有一个编号,这些编号就是他们的“地址”

比如:

变量c所代表的内存单元的地址为0x20fe13

变量i所代表的内存单元的地址为0x20fe18到0x20fe1B。

 

而此时,i中存储的数据即是如图那样同时存储在4个内存单元中的

指针变量:

当定义一个指针变量,系统即赋予其对应的内存空间(32位系统中4字节),指针变量可以认为是用来存储内存地址的变量

指针变量的定义方法是:

 [数据类型] *[指针变量名] ;

 

注1:给指针变量赋值时可以赋以确定的值,比如p=&a;也可以赋以空值,比如p=null;

注2:赋值为Null和不赋值有什么区别?不赋值的时候p的默认值是一个随机数,当调用的时候会调用到随机的东西,这样可能会调用到程序有权使用的资源以外的东西。会报错。而赋值为Null之后,p就有了一个特定的值了,因为null在二进制里是有一个特定的量的

注3:指针的值为Null时,指针就叫空指针。指针未赋值时,指针就叫做野指针

注4:在32位平台中,每个指针变量都默认分配4个字节的存储单元,用来存放变量的地址(这个大小是由“寻址空间”决定的)

 

 

 

当希望给一个指针变量赋值:

[指针变量名] = &[变量名];

 

如果说,变量中存储的是数据。指针变量中存储的就是存储数据的变量的“地址”

比如,我们之前定义的变量i是Int型的,那么定义一个存储i地址的指针变量的过程就是:

 

int *p;
p=&i;

 

 

 

注1:(&这个符号叫“取地址”运算符,用于获取变量的地址)

此时,p中所存储的就是i的地址了。

注2:定义一个int 型变量i,i虽然会占用比如:0x20fe18到0x20fe1B的内存单元,但i的地址只用0x20fe18表示(首个内存单元的地址)。执行p=&i;之后,p中存放的是0x20fe18

禁忌1:给未初始化的指针变量赋值。如:

 

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试给未初始化的变量赋值
*/
int main()
{
    int a=10,b=100;
    int *p1,*p2;//这里定义完指针变量之后未初始化即去调用
    *p1=10;//给p1指向的地址所代表的存储空间赋值
    *p2=100;
    printf("%d %d\n",a,b);
    printf("%d %d\n",*p1,*p2);
    return 0;
}

 

 

参照上面指针变量的注2,因为这个代码调用了不被允许使用的内存,所以程序会报错。

 

 

 

禁忌2:给指针变量赋特定的值(不能用整数给指针变量赋值)。如:

 

#include <stdio.h>
#include <stdlib.h>
/*
这个程序用来测试给指针变量赋特定的值。
*/
int main()
{
    int a=10,b=100;
    int *p1,*p2;
    p1=0x100000;//设定p1指向特定的内存空间
    p2=0x100004;
    printf("%d %d\n",a,b);
    printf("%d %d\n",*p1,*p2);
    return 0;
}

参照上面的指针变量的注2,这个代码试图给使指针变量指向特定的内存空间,这是不被允许的。

因为这段内存空间可能已经被其他程序或系统调用,我们的程序不一定有权调用该内存。所以会报错

(这个程序里的两个指针也算“野指针”)。

 

附:变量值的访问方式:

 

直接访问:

如:printf("%d",i);

间接访问:

如:int *p;p=&i;printf("%d",*p);

注:*这个符号叫“指针”运算符(或称间接访问运算符),可以获得指针指向的地址的值。因为p中放的是i的地址,所以*p等价于*&i 可以获取到i中存储的值。

 

const对指针变量的影响

代码:

#include<stdio.h>
/*
该程序用于测试const对于变量和指针变量的影响 
*/ 
int main()
{
	int i=10,j=20;
	/*
	以下为const修饰在*号之前的情况 
	*/ 
	const int *p1=&i;
	//该状况的const修饰下的指针变量表示不可用改指针变量修改所指变量 
	//即若欲*p1=26;则编译出错。 
	printf("%d\n",*p1);
	//const修饰下的指针变量可以改变值,如下,使p指向另一个地址 
	p1=&j;
	printf("%d\n",*p1);
	
	/*
	以下为const修饰在*号之后的情况 
	*/ 
	int *const p2=&i;
	//该状况的const修饰下的指针变量表示不可修改指针变量的值
	//即若欲p2=&j;则编译出错。 
	printf("%d\n",*p2);
	*p2=26;
	printf("%d\n",*p2);	
}

结果:

注1:如上代码所示,const对指针变量的影响受const与*的相对位置限制。

注2:当定义数组时,若const int a[]={0,1,2,3,4,5}则表示数组内的每个元素都是const型的元素,原理即以上代码所示。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值