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

C语言第四篇:指针的辨析

2016-03-22 11:25 225 查看


一、基础

地址:内存区的每一个字节都有一个编号,这个编号就称为地址。

指针:一个变量的地址称为指针。

指针变量:专门用来存放指针(一个变量的地址)的变量称为指针变量。

定义方法:

基类型    *指针变量名;

        如:int   *p1;   float   *p2;

二、疑难

1、内存单元的存取/访问方式

(1)直接访问——通过变量名访问,如:printf("%d\n",a);
(2)间接访问——通过指针变量访问,如:printf("%d\n",*p);

2、指针运算符与取地址运算符

*p——指针变量p所指向的存储空间(里面的值)
&p——指针变量p的地址
&*p——就是p指针
*&p——就是p指针
下面用一段程序代码来辨析以上表达式:

测试代码:
/*
*Copyright (c)2016,刘兵马俑
*All rights reserved.
*文件名称:main.c
*作    者:刘兵马俑
*完成日期:2016/03/22
*版 本 号:v1.0
*问题描述:C语言的指针运算符与取地址运算符辨析
*程序输出:不同表达式的值
*/
#include <stdio.h>

int main( )
{
//定义整型变量和整型指针
int a=1;
int *pointer=&a;
//输出整型变量的值以及指针的初始值
printf("整型变量  a = %d\n",a);
printf("指针变量  pointer = 0x%0x(&a)\n\n",&a);

//输出需要辨析的表达式
printf("a         —— %d    \n",a)        ;
printf("&a        —— 0x%0x \n",&a)       ;
printf("*&a       —— %d    \n",*&a)      ;
printf("pointer   —— 0x%0x \n",pointer)  ;
printf("&pointer  —— 0x%0x \n",&pointer) ;
printf("*pointer  —— %d    \n",*pointer) ;
printf("&*pointer —— 0x%0x \n",&*pointer);
printf("*&pointer —— 0x%0x \n",*&pointer);

return 0;
}


运行结果






结论:*和& 是一对互逆运算符

三、指针变量使用禁忌——野指针

野指针情况(一)—— 指针使用前未初始化

若指针定义时未初始化,则不能使用“*p=10;”对p指针所指向的内存单元赋值,原因是指针必须在指向明确的前提下才能对其赋值。

野指针情况(二)—— 不能用整数为指针变量赋值,如:

int *p;
p=0x100000;
这是错误的。

总之,OS对于内存空间的管理是十分严格的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息