您的位置:首页 > 编程语言 > C语言/C++

深入理解C语言指针(一)

2017-02-28 16:10 106 查看
1.常量

  其值不发生改变的量,字面量,整型常量,浮点数常量,字符常量等,常量是可以不经过定义初始化,直接使用的量。

直接常量: 12 ,3.14 ,'a' , "abcdefg" 等

符号常量: #define PI 3.1415926

2.变量

  值可以改变的量,一个变量应该有一个变量名,在使用前,必须先定义。

变量名:在声明变量的时候,变量名会和内存中一块地址绑定,可以通过变量名找到对应的内存单元,也可以通过地址。

变量值:是对应的内存区域存放的二进制序列,无论是int型,char型,还是int*型,名称(地址)对应的内存区域中存放的只是0101这样的二进制数,类型不过是约定如何显现使用这些二进制数据。

3.数组

  在C语言中,相同数据类型的量存放在一个组内,数组在内存中是连续分配的。(在计算机中,能直接访问的最小单位是字节)

  char a[6] = {'A','B','C','D','E','F'};

数组名加角标  ----     a[0]           a[1]          a[2]          a[3]         a[4]          a[5]

     内存    ---------      { A }          { B }          { C }         { D }        { E }         { F } 

     地址    ---------    0x00C1    0x00C2   0x00C3     0x00C4   0x00C5   0x00C6

其实无论数组名还是变量名,都是助记符号,汇编时,都是用地址取值的。

我们看几个例子:

char a[3] = {'A','B','C'};
printf("a[0] = %c \n",a[0]);
printf("a = %p\n",a);
printf("&a[0] = %p\n",&a[0]);
printf("&a[1] = %p\n",&a[1]);
printf("&a[2] = %p\n",&a[2]);
输出结果为:

a[0] = A
a = 0x7fff5fb55c3d   //数组的首地址
&a[0] = 0x7fff5fb55c3d
&a[1] = 0x7fff5fb55c3e
&a[2] = 0x7fff5fb55c3f
  在数组声明的时候,这一串内存的首地址被赋予给 a,而数组中的三个字节'A' 'B' 'C' 分别与 a[0] a[1] a[2]名称绑定,a[下角标] 这个名称仅仅是内存量的一个表达助记号,对其取地址 &a[],会得到变量的内存地址。

4.指针pointer ['pɒɪntə]

  用我自己的理解去描述:一种数据类型,约定它存储的值是,某一内存区域的地址值,也就相当于这个变量指向了那个地址。

  这里说一下我的看法,我们先看代码:

int i = 100;       //在内存中申请一块区域存放一个值为 100 的变量,内存与名字 i 绑定
printf("&i = %p \n",&i);    //输出变量 i 的内存地址,16进制输出
int *p = &i;        //将变量 i 的地址值赋给指针变量p
printf("p = %p \n",p);    //输出指针变量p的值(这个值为i的地址值)
printf("*p = %d ",*p);    //用 * 符号,取内存地址对应的值
输出:

&i = 0x7fff55b7ac3c
p = 0x7fff55b7ac3c
*p = 100
  以上代码运行没什么问题,但我觉得 int  *p = &i
最好写成 int*  p = &i ,因为 p 才是指针变量的名称,而其类型为 int* ,p才是这个指针变量的绑定名称,后面的 *p并非一整体,而是用 * 符号取指针变量 p 中保存地址所指向的内存位置的值。

  也就是  *内存地址 = 内存值 ,而
&内存值 = 内存地址

下一章  深入理解C语言指针(二) 之  二级指针
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: