博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言灵魂--指针
阅读量:5141 次
发布时间:2019-06-13

本文共 2092 字,大约阅读时间需要 6 分钟。

什么是指针?理解指针之前得知道什么是地址.

1.数据在计算机中的存储形式:

数据在计算机中是以二进制的形式存储的.计算机的存储器是用半导体集成电路构成的,有N多个二极管元件组成.

每一个二极管元件就如同是一个开关,有两种状态,导通和截止,分别用0和1表示,比如有四个相邻的二极管元件,1和3分别都是导通,则这种状态用1010表示,即可代表整数10.

2.位,字节和地址

(1)位(bit),或叫"比特",每一个二极管元件称为一个"二进制位",是存储信息的最小单位,值是1或0

(2)字节(byte),或叫"拜特".一个存储器包含很多个"二进制位",直接用位来表示和管理很不方便.通常将8个"二进制位"组织成一组,称为"字节",这是最常用的存储单位.通常的占内存200KB,就是占200KB字节,内存为4GB,就是指4GB字节

(3)地址,地址是内存单元的编号.CPU不能直接操作硬盘,只能直接访问内存.

看下图

微机原理中,CPU是通过三根线与内存进行"打交道"的,内存编号是从0开始的 地址线如果有32根.就可以访问控制2^32个字节空间,

也就是4GB(4GB=4*1024MB=4*1024*1024KB=4*1024*1024*1024B(2^32字节)).

那么内存编号范围就是0--4GB-1(FFFFFFFF),所以我们经常可以看见地址编号是5a3fg之类的这种编号 就是用十六进制表示的.

3.那么什么是指针?

指针就是地址,地址就是指针.一个变量的地址就是该变量的指针,指针指向该变量单元,那么通过该变量的指针(地址),就能找到访问该变量.把专门用来存放另外一个变量的指针的变量称为"指针变量",指针变量的值(指针变量中存放的地址)就是地址(指针).指针变量就是存放地址的变量.

下面来看一个程序例子:

1 #include 
2 void main() 3 { 4 int * p; 5 /* 6 p是个指针变量(变量名字),int*表示p变量只能存放int类型变量的地址, 7 *表示指向的对象,*p代表p所指向的变量,*p最准确的解释:表示的是以p的内容(值)为地址的变量 8 例如p的值现在为33f8bc 那么谁的地址是33f8bc,那么*p就等价谁 9 */10 int i=10;11 int j;12 p=&i;//p存放了i的地址,那么p就指向变量i13 printf("%x\n",p);14 }

仔细反复读一下上面的注释,相信你会有收获的.

4.

如何通过被调函数改变主调函数中普通变量的值

1)实参为相关变量的地址
2)形参为以该变量的类型为类型的指针变量
3)在被调函数中通过 *形参变量名 的方式可以修改主函数中变量的值

1 # include 
2 void f(int *i) 3 { 4 *i=10; 5 6 } 7 void main() 8 { 9 int i=99;10 f(&i);11 printf("%d\n",i);12 }

但是如果是下面这样的,是不能改变i的值的

1 # include 
2 void f(int i) 3 { 4 i=10; 5 6 } 7 void main() 8 { 9 int i=99;10 f(i);11 printf("%d\n",i);12 }

当然你把函数换成int类型的 调用 之后接受它的一个返回值 那么也是可以实现的 

5.指针与一维数组(学数据结构中的顺序存储结构会很有用)

直接看个例子吧

1 # include 
2 void main () 3 { 4 int a[5]={
2,45,5,67,78}; 5 printf("%x\n",a); 6 printf("%x\n",&a[0]); 7 /*总结: 8 1.一维数组变量名就是指向数组第一个元素,是个指针常量,值不能被改变 9 存放的是第一个元素的地址,此程序运行结果,两者输出是一样的10 2.数组的下标和指针变量的关系11 a[i]<<==>>*(a+i)12 i=3,因为a指向第一个元素,那么a+3指向第四个元素,那么*(a+i)就是第四个元素本身,也就是a[3]13 3.指针变量的运算14 指针变量之间不能互相加,乘,除,但是若两个指针变量在同一个数组那么他们可以相减.15 指针变量可以加减一整数,前提是最终结果不能超过指针的范围16 */17 }

直接看上面的注释吧 基本的东西已经写在上面了

转载于:https://www.cnblogs.com/zhangyihui/p/3619323.html

你可能感兴趣的文章
Python数据可视化之Pygal(雷达图)
查看>>
Java学习笔记--字符串和文件IO
查看>>
转 Silverlight开发历程—(画刷与着色之线性渐变画刷)
查看>>
SQL语法(3)
查看>>
在js在添版本号
查看>>
sublime3
查看>>
Exception Type: IntegrityError 数据完整性错误
查看>>
Nuget:Newtonsoft.Json
查看>>
【luogu4185】 [USACO18JAN]MooTube [并查集]
查看>>
手机号脱敏处理
查看>>
CI控制器调用内部方法并载入相应模板的做法
查看>>
Hdu - 1002 - A + B Problem II
查看>>
HDU - 2609 - How many
查看>>
每天CookBook之Python-003
查看>>
每天CookBook之Python-004
查看>>
Android设置Gmail邮箱
查看>>
StringBuffer的用法
查看>>
js编写时间选择框
查看>>
PHP压缩文件操作
查看>>
Java数据结构和算法(四)--链表
查看>>