ptr[-1]的作用和用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ptr[-1]的作用和用法相关的知识,希望对你有一定的参考价值。

参考技术A 参考
https://blog.csdn.net/flower195/article/details/19423533

ptr[-1]其实表示的是ptr指针当前指向的上一个元素。指针名可当作数组名来用,在用作数组时,实际上是读取数组名,也就是一个地址,加上一个偏移地址。这个偏移地址的计算是就是:下标的值*元素类型的大小。这样就可打到要取得数的位置,不会判断下标是否是负数。

下面看一个例子:

程序的输出结果是:

因为,gcc 对局部变量a,b是按顺序分配的,这样通过适当的偏移值就可访问变量。

c语言 指针问题

参考技术A 指针的声明与初始化
1、不恰当的指针声明
考虑如下的声明:
int* ptr1, ptr2; // ptr1为指针,ptr2为整数

正确的写法如下:
int* ptr1, *ptr2;

用类型定义代替宏定义是一个好的习惯,类型定义允许编译器检查作用域规则,而宏定义不一定会。
使用宏定义辅助声明变量,如下所示:
#define PINT int*
PINT ptr1, ptr2;

不过结果和前面所说的一致,更好的方法是使用下面的类型定义:
typedef int* PINT;
PINT ptr1, ptr2;

2、使用指针未初始化
在使用指针之前未初始化会导致运行时错误,如下面的代码:
int* p;
...
printf("%d\n", *p);

指针p未被初始化,可能含有垃圾数据
3、处理未初始化指针
总是用NULL来初始化指针
用assert函数
用第三方工具
把指针初始化为NULL更容易检查是否使用正确,即便这样,检查空值也比较麻烦,如下所示:
int *pi = NULL;
...
if(pi == NULL)
//不应该解引pi
else
//可以使用pi


我们可以使用assert函数来测试指针是否为空值:
assert(pi != NULL);

指针的使用问题
缓冲区溢出
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为”堆栈”.。在各个操作进程之间,指令会被临时储存在”堆栈”当中,”堆栈”也会出现缓冲区溢出。
下面几种情况可能导致缓冲区的溢出:
访问数组元素时没有检查索引值
对数组指针做指针算术运算时不够小心
用gets这样的函数从标准输入读取字符串
误用strcpy和strcat这样的函数
1、测试NULL
使用malloc这样的函数的时候一定要检查返回值,否则可能会导致程序的非正常终止,下面是一般的方法:
float *vector = malloc(20 * sizeof(float));
if(vector == NULL)
//malloc分配内存失败
else
//处理vector


2、错误使用解引操作
声明和初始化指针的常用方法如下:
int num;
int *pi = #

下面是一种看似等价但是错误的声明方法:
int num;
int *pi;
*pi = #

3、迷途指针
参见《C迷途指针》
4、越过数组边界访问内存
没有什么可以阻止程序访问为数组分配的空间以外的内存,下面的例子中,我们声明并初始化了三个数组来说明这种行为:
#include
int main()

char firstName[8] = "1234567";
char middleName[8] = "1234567";
char lastName[8] = "1234567";
middleName[-2] = 'X';
middleName[0] = 'X';
middleName[10] = 'X';
printf("%p %s\n", firstName, firstName);
printf("%p %s\n", middleName, middleName);
printf("%p %s\n", lastName, lastName);
return 0;

以上是关于ptr[-1]的作用和用法的主要内容,如果未能解决你的问题,请参考以下文章

c语言 指针问题

c语言 指针问题

C语言中指针的用法介绍(2)

索引运算符对任意指针有啥作用?

C++智能指针的作用,模拟实现auto_ptr,scoped_ptr,shared_ptr

为啥 lambda init-capture 对 unique_ptr 不起作用?