学习笔记---初识指针
来源:互联网 发布:电脑杀毒清理软件 编辑:程序博客网 时间:2024/04/30 07:39
变量与变量指针:
变量:
当定义一个变量,系统即赋予其对应的内存空间。变量的数据类型将影响变量得到的内存的大小
如:
int 型变量的字节数为4,因此当定义一个int 型变量时。系统将随机的取4个连续的内存单元作为该变量的存储空间。
比如
int i =100;float f=2.3; char c='k';
内存中可能这样给这几个变量分配空间:
这些内存单元都有一个编号,这些编号就是他们的“地址”
比如:
变量c所代表的内存单元的地址为0x20fe10
变量i所代表的内存单元的地址为0x20fe18到0x20fe1B。
而此时,i中存储的数据即是如图那样同时存储在4个内存单元中的。
指针变量:
当定义一个指针变量,系统即赋予其对应的内存空间(32位系统中4字节),指针变量可以认为是用来存储内存地址的变量。
指针变量的定义方法是:
[数据类型] *[指针变量名] ;
注:给指针变量赋值时可以赋以确定的值,比如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中存储的值。
- 学习笔记---初识指针
- [C学习]指针初识
- C++学习笔记(第六章 初识指针 及 指针与数组 之一)
- 学习笔记:初识ajax
- Android学习笔记 初识
- [学习笔记]初识javascript
- Titan学习笔记-初识
- Tez学习笔记-初识
- Linux学习笔记--初识
- 【学习笔记】初识JavaScript
- Mybatis学习笔记-初识
- 【学习笔记】Python初识
- 苏嵌学习之初识指针
- 初识指针的学习总结(1)
- BREW学习笔记 - 初识Brew
- 【jQuery 学习笔记】初识jQuery
- Hadoop学习笔记-Hadoop初识
- 初识apache cassandra 学习笔记
- 嵌入式系统的发展现状
- Android中的GridView的简介,配置与使用
- Kingdom of Black and White
- mysql免安装配置教程
- 并发与并行
- 学习笔记---初识指针
- 关于PHP数组及关联数组排序的函数讲解
- 数据库引擎与字符集的设置
- wait不一定需要notify
- AC代码
- [LeetCode]Course Schedele II
- no-install mysql安装及无法启动问题(5.7.16)
- poj1006_Biorhythms_扩展欧几里得_中国剩余定理
- SVG 复用(defs、symbol、use)