c语言中普通变量,指针变量,指针的区别

 

首先明确的是,在编译的时候编译器会把所有的变量名都转换成相对的内存地址,所以变量名不占内存。内存的最小单位是字节。
1、普通变量
如: int a;
声明一块名为a(首地址)大小为4字节的内存空间,变量代表了一个存储单元,此时未初始化,所以a只是表示这块地址的名称,没有其他意义。&a取a的地址。*a会出错
a=1;
给这块内存初始化值(把1存到a表示的这块地址中),这时a就代表1。


2、指针变量
(转自:https://blog.csdn.net/cool_oyty/article/details/8078632)
 在编译器里定义一个指针变量,编译器会给这个指针变量分配一个空间,这个空间里存放的是一段内存的首地址,先解释一段内存,一段内存的大小是与你所定义的指针类型相关的,比如int,这段内存占四个字节(当然要看你的机器是多少位的了),则这段内存的首地址是第一个字节的地址,如char类型,占一个字节,这段内存的首地址就是这个字节的地址,还如结构体类型,此时内存大小要看该结构体的所有属性所占内存之和。现在解释这个空间,编译器给指针分配的空间大小是和CPU的寻址长度相关的,比如32位的CPU,它的寻址长度为32位,那么这个空间也就占四个字节,其实不管你定义什么样的指针类型,这个空间只是用来存地址,只占四个字节,而真正该空间所存的地址是哪一段内存的首地址才和所定义的指针类型相关。 

作者:Meditating 
原文:https://blog.csdn.net/wu9797/article/details/78082795 

int *q;只有地址,没有内存空间。这个地址是随机地址。

(1)没有申请内存空间:

int *q;

*q = 1;

cout<<*q<

错误!指针变量q没有空间,不能直接存放数据。

注:指针变量赋值后就是一个指针

(2)申请内存空间:

int *q = new int;

*q = 1;

cout<<*q<

正确,存放数据之前给指针变量申请了一个int类型大小的堆内存空间。

2、对比:

int *q;

*q = 1;

错误!q没有指向一块内存空间,不能直接存放数据。

int *q, a = 1;

q = &a;

正确,两次q的地址不一样。q=&a:q指向变量a所在的内存空间,变量a是一个int型,在内存中有大小为int类型的内存空间。算是间接地给q分配了空间吧。
--------------------- 
 

3、指针

系统为每一个内存单元分配一个地址值,C/C++把这个地址值称为“指针”。如有int i=5;,存放变量i的内存单元的编号(地址)&i被称为指针。

3、指针变量和指针的区别

(转自:https://blog.csdn.net/u011555996/article/details/79496203)

指针变量则是存放前述“地址值”的变量,也可以表述为,“指针变量”是存放变量所占内存空间“首地址”的变量(因为一个变量通常要占用连续的多个字节空间)。比如在int i=5;后有一句int *p=&i;,就把i的指针&i赋给了int *型指针变量p,也就是说p中存入着&i。所以说指针变量是存放指针的变量。
有一个事实值得注意,那就是有不少资料和教科书并没有如上区分,而是认为“指针是指针变量的简称”,如对int *p=&i;的解释是:声明一个int *型指针p,并用变量i的地址初始化;而严格说应该是声明一个int *型指针变量p才对。所以有时看书要根据上下文理解实质,而不能过于拘泥于文字表述。

 

注: 运算符

& 返回变量的地址。 &a; 将给出变量的实际地址。
* 指向一个变量。 *a; 将指向一个变量。

你可能感兴趣的:(C,指针,指针变量)