Appearance
指针
一个内存存储的信息保存的是是什么内容取决于读取的方式,由编译器来确定你定义的数据类型,如果不正确则进行报错
间接访问
一个指针访问他所指向的地址
**注:**不要直接给一个没有初始化的地址赋值
- 访问非法地址:终止程序
- 访问地址没有对齐:UNIX系统总线错误
- 位于合法的内存:出现不可预知的错误
NULL指针
指向0,可以把它和0比较来判断是不是一个空指针,但是他的实际值可能不是0,这是一种源代码约定,对一个空指针进行求解是非法的。
最好对没有初始值的指针初始化为NULL
指针常量
直接使用*对一个整形去赋值是错误的,应该进行类型的转换
C
* 100 = 25;//错误
* (int *)100 = 25;//正确
这种方式通常用来访问某些固定的内存地址,比如硬件接口等
指针的指针
C
int a = 12;
int *b = &a;
int **c = &b;
指针的使用示例解析
*++cp
:表示的是cp原先指向的地址之后的一个地址的内容
*cp++
:执行顺序(1)返回现在的cp(2)cp加一(3)对原来的地址进行取值操作
++*cp
:两个符号的结合性质都是从右到左,所以先对cp取值,然后对取到的值进行左++操作
(*cp)++
:首先进行访问然后对结果进行++
++*++cp
:先对cp代表内存之后的那个内存内容进行获取,然后进行加一
**注:**在使用指针操作时对会对原数据造成破坏的数据进行备份
C
int find_char(char **strings,int value)
{
assert(strings != NULL);//如果结果不正确就打印一条提示
while(*strings != NULL)
{
while(**strings != '\0')
{
if(*(*strings)++ == value)//对原来的数据进行了改变
return 1;
}
strings ++;
}
}
正确的方式:
C
int find_char(char **strings,int value)
{
char *string;
while((string = *strings) != NULL)//进行备份
{
while(*string != '\0')
{
if(*string++ == value)
return 1;
}
strings ++;
}
}
指针运算
算数运算
- 指针±整数
当一个指针和一个整数执行算数运算,整数会在加法运算前根据指针指向的数据类型进行调整,减法会在得到相应的值之后除以指针的类型大小
关系运算
前提是必须是一个数组之内的两个值
协议允许一个指针和数组之后的那个地址进行比较,但是不允许和之前的那个地址进行比较
C
1 #include <stdio.h>
2 #define NUM 5
3 float values[NUM];
4 float *vp;
5
6 int main()
7 {
8 for( vp = &values[0]; vp <&values[NUM];)
9 *vp++ = 0;
10 for( vp = &values[NUM]; vp > &values[0];)
11 *--vp = 0;
12 for( vp = &values[NUM-1]; vp >= &values[0];vp--)//这种在有的机器上的运行可能是错误的
13 *vp = 0;
14 return 0;
15
16
17 }