C语言指针学习(1)

前言

指针是C语言中一个重要概念,也是C语言的一个重要特色,正确而灵活地运用指针可以使程序简洁、紧凑、高效。每一个学习和使用C语言的人都应当深入的学习和掌握指针,也可以说不掌握指针就没有掌握C语言的精华。

一、什么是指针

想弄清楚什么是指针,必须先弄清楚数据在内存中是如何存储的,又是如何读取的。

如果在程序中定义了一个变量,在对程序进行编译时系统就会给这个变量分配内存单元。编译系统根据程序中定义的变量类型分配一定的长度空间,如visual C++为整型变量分配四个字节,为字符型变量分配一个字节,内存中的每一个字节都有一个编号,这就是**"地址"**。它相当于旅馆中的房间号,在地址所标志的内存单元中存放的数据则相当于旅馆房间中居住的旅客。

由于通过地址能找到所需的变量单元,可以说地址指向该变量单元 。打个比方:一个房间的门口挂了一个房间号2000,这个2000就是房间的地址,或者说2000指向该房间 ,因此将地址形象化地称为"指针" ,也就是说通过它能找到地址的内存单元。

说明(非常重要): 在C语言中,数据是分类型的,对不同类型的数据,在内存中分配的储存单元(字节数)大小也不一样的,存储方式也是不同的(如整数是以补码的形式存放的)。如果指定了地址是1010,要从带单元中调出数据是做不到的,虽然能找到对应的存储单元,但时不能确定是从一个字节还是2个字节还是三个字节取数据,也没有说是按何种存储方式进行存储数据的,因此C语言的地址包括位置信息(纯地址)和它所指向的数据的类型信息,如&a,一般称它为变量a的地址。

二、直接访问和间接访问

在我们进行指针学习的过程中,一定要弄清楚存储单元的地址存储单元的内容 这2个概念。

图1

如图所示程序已定义了3个整型变量ijk,在程序编译时,系统可能分配地址为2000~2003的4个字节给i,2004~2007的4个字节给j,2008~2011的4个字节给k。

在程序中通过变量名来应用变量的值,例如:

printf("%d",i);

在执行上面语句时,首先通过变量名找到对应的地址,从该四个字节中按照整型数据的存储方式读出整型变量i的值,然后按十进制整数格式输出。(对变量的访问都是通过地址经行的)

scanf("%d",&i);

在执行时,把键盘输入的值送到地址为2000开始的整型存储单元中,如果有语句:

k=i+j;

就是从2000~2003的4个字节中取出值(3),2004~2007的4个字节中取出值(6),将它们相加再将其和(9)送到k所占用的2008~2011的4个字节。

这种按变量名直接进行的访问,称为**"直接访问"**方式。

还可以采用另一种称为**"间接访问"**的方式,将变量i的地址存放在另一个变量中,然后通过该变量来找到变量i的地址,从而访问i变量。

图2

结合图1和图2,定义一个变量i-pointer用来存放整型变量的地址,可以通过下面语句将i的地址(2000)存放到i-pointer中:

i-pointer=&i;

这时,i-pointer的值就是2000,先找到存放变量i地址的变量i-pointer,从其中得到变量i的地址,从而找到变量i的存储单元,然后对它进行存取访问。

为了将3送到变量中,可以有2中表达方式

1.将3直接送到i所标识的单元中,例如i=3;

2.将3送到i-pointer所指向的单元(即变量i的存储单元),例如***i-pointer=3;**其中*i-pointer表示i-pointer的指向。

指向是通过地址来体现的。假设i-pointer中的值是变量i的地址,这样i-pointer和i就建立了一种联系,通过i-pointer知道i的地址,从而找到i的存储单元。

三、指针变量(简讲,下一期详细讲解)

如果有一个变量专门用来存放另一个变量的地址,则称它为指针变量,上述的i-pointer就是指针变量,指针变量就是地址变量,用来存放地址,指针变量的值是地址。

**注意:**可以说变量i的指针是2000,而不能说i的指针变量是2000,指针是一个地址,而指针变量是存放地址的变量。

小编下面给大家举一个例子认识一下指针变量:

通过指针变量访问整型变量

cs 复制代码
#include<stdio.h>
int main()
{
    int a=100;
    int *hz;  
    hz =&a;
    printf("a=%d \n",a);
    printf("*hz=%d \n",*hz);
  return 0;
}


a=100 
*hz=100 
PS C:\csay\cyuyan> 

小结

指针是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,希望通过小编的介绍,能够帮助大家更好的学习知识,同时也希望大家对小编的不足之处即使指出,小编将在第一时间进行修正。

🚀感谢:给读者的一封信

亲爱的读者:

这篇文章中我投入了大量的心血和时间,希望为大家提供有价值的内容。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持了,这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

相关推荐
ChoSeitaku9 分钟前
链表循环及差集相关算法题|判断循环双链表是否对称|两循环单链表合并成循环链表|使双向循环链表有序|单循环链表改双向循环链表|两链表的差集(C)
c语言·算法·链表
娅娅梨11 分钟前
C++ 错题本--not found for architecture x86_64 问题
开发语言·c++
DdddJMs__13514 分钟前
C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
c语言·leetcode·题解
汤米粥17 分钟前
小皮PHP连接数据库提示could not find driver
开发语言·php
冰淇淋烤布蕾20 分钟前
EasyExcel使用
java·开发语言·excel
拾荒的小海螺26 分钟前
JAVA:探索 EasyExcel 的技术指南
java·开发语言
马剑威(威哥爱编程)1 小时前
哇喔!20种单例模式的实现与变异总结
java·开发语言·单例模式
娃娃丢没有坏心思1 小时前
C++20 概念与约束(2)—— 初识概念与约束
c语言·c++·现代c++
白-胖-子1 小时前
【蓝桥等考C++真题】蓝桥杯等级考试C++组第13级L13真题原题(含答案)-统计数字
开发语言·c++·算法·蓝桥杯·等考·13级
好睡凯1 小时前
c++写一个死锁并且自己解锁
开发语言·c++·算法