学习笔记---初识指针
2016-11-27 19:30
148 查看
变量与变量指针:
变量:
当定义一个变量,系统即赋予其对应的内存空间。变量的数据类型将影响变量得到的内存的大小
如:
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:给未初始化的指针变量赋值。如:
禁忌2:给指针变量赋特定的值(不能用整数给指针变量赋值)。如:
参照上面的指针变量的注2,这个代码试图给使指针变量指向特定的内存空间,这是不被允许的。
因为这段内存空间可能已经被其他程序或系统调用,我们的程序不一定有权调用该内存。所以会报错
(这个程序里的两个指针也算“野指针”)。
附:变量值的访问方式:
直接访问:
如:printf("%d",i);
间接访问:
如:int *p;p=&i;printf("%d",*p);
注:*这个符号叫“指针”运算符(或称间接访问运算符),可以获得指针指向的地址的值。因为p中放的是i的地址,所以*p等价于*&i 可以获取到i中存储的值。
变量:
当定义一个变量,系统即赋予其对应的内存空间。变量的数据类型将影响变量得到的内存的大小
如:
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++学习笔记(第六章 初识指针 及 指针与数组 之一)
- 孙鑫VC学习笔记:第十三讲 保存可串行化的类对象 如何获取文档与视类指针
- Ajax学习笔记一:初识Ajax
- 指针的理解(1)-学习笔记
- C++学习笔记二 —— 3.3 指针类型
- C++学习笔记(13)——利用对象、引用、指针调用虚函数
- C/C++学习笔记:指针与字符串
- 超强的指针学习笔记
- 超强的指针学习笔记
- C/C++学习笔记:指针与数组
- 孙鑫VC学习笔记:第十二讲 介绍常量指针、指针常量,文本、二进制文件
- 孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取
- 孙鑫VC学习笔记:第十二讲 (一) 介绍常量指针、指针常量,文本、二进制文件
- ASP Forum2.0学习笔记之一---初识default.aspx
- 超强的指针学习笔记
- wpf学习笔记---初识xaml标签语言
- wpf学习笔记---初识xaml标签语言
- 指针学习笔记
- 超强的指针学习笔记
- 超强的指针学习笔记