- 地址与值的关系
举例:
图中表明了计算机中内存的存在形式,矩形框上面的整数为地址编号(内存完成编号)。这样的编号对于程序设计来说显得十分不变。因此,指针诞生了。
计算机中的内存形式.png
高级语言的特点就是通过变量来访问内存位置。将以上这张图中的地址位置号用变量替换后如下图。
用变量替代地址位置.png 值得注意的是,地址变量与内存之间的关联并不是有硬件实现,而是由编译器完成这个操作。硬件通过地址访问内存。
int a =112 , b =-1 ;
float c = 3.14;
int *d = &a;
int *e = &c;
但是,图中地址c
中的值并不是float
,而是int
。所以不能简单地通过地址中的值来判断程序中变量的值,而应该从程序中判断这个内存对应的值和类型。
另外,操作符&
表针初始化操作。如*d = &a
,表示为变量a
的地址为d
,也就是编号为100
。
- 定义指针操作符——&
值得注意的是,d,e
被声明为指针,并不会改变指针对应的值的操作方式:变量的值就是分配给这个变量对应的内存中的值。即地址100(d),108(e)
中的值为多少取决于a,c
。
另外,&
不能位于=
左边。
- 间接访问操作符——
*
若想访问a,c
,除了直接使用变量(直接访问)a,c
外,还可以用间接访问方式*d,*e
.
间接访问过程.png*Note:指针一个整数值
- 未初始化和非法指针
例如:
int *a;
*a = 123;
这样做的意图为:声明一个指针变量,往指针变量对应的内存中存放123
,但是!存在编号多少的内存呢?这就不得而知了。
如果变量为静态的,这被初始化为0
;如果变量是自动的,则不会被初始化。当执行程序时,这种做法可能会随机访问到一些不该访问的内存(如程序中其他变量对应的地址)。为了防止这种间接访问方式造成不可预知的错误,所示使用这种方式前,一定要确保这个变量之前被初始化了。
正确的方式:
int i=123;
*a = &i;
另一种正确的方式:
*&a=123;
&
操作符产生变量a
的地址,*
操作符表示引用变量a
的地址,则整个表达式的意义为——a=123
。
- 指针表达式
以下面的代码为例。
char ch = 'a' ;
char *cp = &ch ;
——变量ch
的地址。
cp
2.png
——指针变量cp
的地址
3.png
——*cp
得到变量ch
的值
4.png
——*
的优先级高于+
,所以*p+1
表示ch+1
即'a'+1
5.png
——*(cp+1)
得到下一个第一的值
6.png
——指向下一个地址
7.png
——首先保存当前地址,再指向下一个地址
8.png
——间接访问cp+1
中的值
9.png
——++
操作符首先产生cp
的一个拷贝,然后再++
操作符增加cp
的值,最后在cp
的拷贝上执行操作(++
操作符的优先级高于*
)
10.png
——因为两个操作符的结合方向都是从右往左,故执行ch+1
11.png
——首先间接访问,然后自增,但ch
仍然是原来的值
13.png
——ch
自增
14.png
网友评论