c语言指针变量的定义和使用

c语言中,指针变量在使用之前,必须对其进行定义,然后进行初始化(或定义时进行初始化)

1 指针变量定义和初始化


1.1 指针变量的定义

指针变量的定义: 定义一个指针变量必须指定 存储类型和数据类型,常如下所示:
<存储类型(缺省为auto)> <数据类型(不知类型需定义为void)> *指针名;

例:
int *a1;
char *a2;
static int *a3;
定义了 a1,a2,a3三种不同类型的指针。
在指针变量的存储类型 数据类型包括指针名的规则都同普通变量一致。
指针的生命周期同普通变量的生命周期一致。
指针变量所定义的数据类型为指针所指向的目标的数据类型,例 a1 指向一个int数,a2指向一个字符型。

1.2 指针变量的初始化

指针变量在定义的同时,也可以赋一个初始值,这种操作称之为指针的初始化操作,由于指针变量中存放的是一个内存地址,所以初始化时候我们必须赋予一个地址
例:
定义时初始化
<存储类型> <数据类型> *指针名= [初始化地址];
int *a1 =&c;
//将c变量的地址赋予给指针变量a1,而不是将c的值赋予给指针变量;
当把一个普通变量赋予给指针变量:
1 这个普通变量必须在赋予给指针变量之前以后被赋予实际值或编译器默认的NULL,即拥有合法的内存区域,
2 这个普通变量的数据类型必须同指针变量的数据类型一致。
例:
char a1; //定义一个普通变量a1
char *a2=&a1; //将普通变量a1所指向的地址赋予给指针变量a2;


int b1=100; //定义一个普通变量
int *b2 =&b1; //将普通变量b1的地址赋予给b2;
int *b3 =b2; //将b2这个地址赋予给b3;


int c1=200;
int *c2=c1; //将一个整型赋予给一个指针变量,错误


char a=’a’;
int *a1=&a; //指针变量和普通变量的类型不一致,所以发生初始化异常

1.3 void指针

在语言中,还可以定义一种void类型的指针,这个指针变量可以指向一种抽象的数据类型,即定义一个指针变量,不指向具体的数据类型,这种指针我们称之为无类型指针。
<存储类型> *指针名
无类型指针可以接受任何类型的指针或地址传入,但是如果由无类型指针转换其它有类型的指针,那么必须进行强制转换才可以将无类型指针赋予给其它类型的指针。


2 指针的使用


2.1 取地址符& 取内容运算符*

取地址符 & 形式如下:

& 操作对象


取地址运算符必须是一个左值表达式(变量名或有名存储区域);运算结果为:操作对象所对应的地址。
注意: *** 数组名不是变量,数组名是一个左值表达式,因为数组不能采用取地址运算符&,数组名本身就是一个常量的地址表达式。

例:
int a1;char a2;float a3;
//如果采用地址表达式 &a1;&a2;&a3;则返回结果为三种分别为: 整型指针 字符指针 浮点型指针。
由于数组名和常量不是左值表达式,寄存器变量没有存储地址,所以数组名 常量 寄存器变量 都不能进行&取地址符运算
例:
int b,c[5];
register int d;
&b,&c[1] //通过这些取址运算可以获取一个整型指针 一个数组第2个元素所对应地址;
&c &d; //由于数组不是左值表达式所有&c错误,&d由于d的存储类型为register本身无地址,所以获取地址时,会产生错误。


指针运算符
例:
* 操作对象

操作对象必须为一个内存地址
*就是获取操作对象中所对应的内存地址中的值。
例:
char a1,*a2=&a1;
*(&a1)=’d’;
*a2=’d’;
a1=’d’;
//以上三种表达式实现的效果一致都是向a1所对应的内存地址写入一个值d。



& 和*的关系

&运算符和*运算符是一个互逆的运算符:
*(&a1)=a1; //例a1为普通变量
&(*a1)=a1; //例a1为一个指针变量



3 指针的正确用法

使用指针的目的就是采用指针引用变量。

使用指针的正确方法:

1 必须按照被引用的变量类型说明指针变量;
2 将被引用变量的地址赋予给指针变量,使指针变量指向目标对象。
例:
int *a1;
*a1 =100;
//以上是一个典型的错误定义方式, 首先定义了一个int指针变量,当我们赋值给指针变量时,由于指针变量没有指向任何内存区域,所以此时我们赋值时,就会出现计算机系统不知将100这个常量放入内存何种位置。
所以我们在对一个指针进行赋值的时候,必须先判断一个指针是否拥有合法的内存地址。

4 NUll指针

NULL指针是ASCII标准中定义一个没有指向任何地址的指针,如果一个指针为NULL,此时我们不能对它进行任何引用和赋值操作,因为null代表这个指针变量没有指向任何可用的内存地址。

相关阅读:
linux c 数据存储类型
c auto存储类型
c 变量存储类型 -寄存器类型
c 语言存储类型之extern
c变量存储类型static
c 语言中 变量存储类型简介
c语言指针概述 指针简介
c语言中指针简介
c语言指针注意事项