首页 > 其他分享 >初识指针以及一些创建指针变量的常见问题和一些避免使用错误指针的方法

初识指针以及一些创建指针变量的常见问题和一些避免使用错误指针的方法

时间:2023-07-15 19:31:56浏览次数:43  
标签:arr 常见问题 变量 指向 int 初识 ptr 指针

在C语言中,指针是一种变量,用于存储另一个变量的内存地址。指针可以指向任何数据类型的变量,包括基本数据类型(如整型、字符型等)和复合数据类型(如数组、结构体等)。通过指针,我们可以直接访问和修改指向的变量的值,而不需要知道变量的名称。

指针的声明使用星号(*)来表示,例如:


int* ptr;  // 声明一个指向整型变量的指针

char* str; // 声明一个指向字符型变量的指针

指针的使用包括以下几个方面:

1. 取址操作:使用取址符号(&)获取变量的内存地址,将地址赋给指针变量。

int num = 10;

int* ptr = &num // 将变量num的地址赋给指针ptr

2. 解引用操作:使用解引用符号(*)获取指针指向的变量的值。

int num = 10;

int* ptr = &num

int value = *ptr;  // 获取指针ptr指向的变量的值

3. 指针运算:可以对指针进行加减运算,以及比较运算。指针的加减运算是以字节为单位的,根据指针所指向的数据类型进行偏移。


int arr[5] = {1, 2, 3, 4, 5};

int *ptr = arr;  // 将数组arr的首地址赋给指针ptr

ptr++;  // 指针向后移动一个元素,指向arr[1]

指针在C语言中具有重要的作用,常用于动态内存分配、数组和字符串的处理、函数参数传递等方面。但指针的使用也需要谨慎,不当的指针操作可能导致内存错误和程序崩溃。因此,在使用指针时应注意对指针的合法性进行判断,避免出现悬空指针和内存泄漏等问题。

现在举例说一写野指针(指针使用不当)的案例:

int* a;
*a=20;

上面的指针变量a就没有初始化,这是非常危险的;如果这段代码执行起来,就会在内存中随便分配一个地址并且把这个地址指向的空间赋值为20,而我们这个随便分配的地址里面很可能储存着重要的信息,贸然赋值就会更改其中的信息,可能就会导致重要的数据丢失。所以我们在使用指针变量的时候要先初始化:

int* a = 0;
*a = 20;

下面再分享一个例子:

int arr[10] = {0};
int* p = arr;//数组不需要&来取地址
int i = 0;
for(i =0; i<12; i++)
{
*p = i;
p++;
}

首先,数组 arr 的大小是10,但在循环中尝试给数组赋值12次,这将导致数组越界访问,可能会引发未定义的行为。其次,在循环中,指针 p 被递增,超过了数组的边界,也会导致指针越界访问。指针越界访问的后果就是它会随便找一块内存,给里面进行赋值。这是非常危险的。

再来一个例子:

int* test()
{
int a = 0;
return &a;
}
int main()
{
int* p = test();
printf("%d\n",*p);
return 0;
}

初识指针以及一些创建指针变量的常见问题和一些避免使用错误指针的方法_指针

我们可以看见代码也能正常的运行,但是这段代码是有问题的。在这段代码中我们调用了test这个函数,这个函数是一个指针类型,我们最后返回的是变量a的地址,但是我们创建的这个变量a是一个局部变量,出了test函数之后这个变量a就会被销毁,这时候我们再去访问a的地址就是违法的,因为它已经被销毁了,计算机可能把这个地址分配给了别的数据,就比如张三今天去酒店住了一晚,当天晚上打电话给李四他住在某某宾馆某某房间(相当于我们去访问a的地址),让李四第二天过来住。但是第二天张三已经退房了,这时候李四过来住就是违法的。我们这段代码的解决方法就是把a定义为全局变量,这样出了函数也不会被销毁。

那么我们怎么去避免使用指针带来的这些问题呢?

我们可以采取以下几种方法来避免常见的问题:

1. 初始化指针:在使用指针之前,确保将其初始化为有效的地址或者空指针(NULL)。未初始化的指针可能会指向一个随机的内存地址,导致未定义的行为。


int* ptr = NULL;  // 初始化指针为NULL

2. 空指针检查:在对指针进行操作之前,先检查指针是否为空。空指针是指未指向任何有效对象的指针,对空指针进行解引用操作会导致程序崩溃。


if (ptr != NULL) {

    // 对指针进行操作

}

3. 避免悬空指针:悬空指针是指指向已经释放或者无效的内存地址的指针。在释放内存或者指针变量超出作用域后,要将指针设置为NULL,避免使用悬空指针。


int* ptr = malloc(sizeof(int));

// 使用ptr指向的内存

free(ptr);

ptr = NULL;  // 将指针设置为NULL

4. 避免指针越界访问:确保在使用指针访问数组或者其他内存时,不要超出其有效范围。越界访问可能会导致内存错误和未定义的行为。


int arr[5] = {1, 2, 3, 4, 5};

int* ptr = arr;

for (int i = 0; i < 5; i++) {

    printf("%d ", *ptr);  // 正确访问数组元素

    ptr++;

}

5. 注意指针类型匹配:指针的类型应该与所指向的对象类型匹配。不匹配的指针类型可能会导致类型错误和未定义的行为。


int num = 10;

float* ptr = #  // 错误:指针类型不匹配

6. 尽量避免多级指针:多级指针是指指向指针的指针,容易引起混淆和错误。在实际使用中,尽量避免使用多级指针,可以通过引入结构体或者其他数据结构来简化指针的使用。


int** pptr;  // 多级指针

通过以上的注意事项,可以减少指针相关问题的发生,提高代码的可靠性和稳定性。同时,对于指针的使用要谨慎,确保对指针进行正确的操作和管理,避免出现内存泄漏和悬空指针等问题。

标签:arr,常见问题,变量,指向,int,初识,ptr,指针
From: https://blog.51cto.com/u_16143827/6733183

相关文章

  • 01. 初识STM32
    一、什么是单片机  单片机(Single-ChipMicrocomputer)是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、......
  • 指针数组,数组指针,函数
    指针数组指针数组,首先它是一个数组,数组里面的存储的是一个个指针,例如int*p[5];,指针数组里面的元素大小都是一样的,都是一个指针的大小,也就是8个字节(64位机器),sizeof(p);就为40个字节。下标的本质:下标的本质就是偏移量,[]的含义是解引用#include<stdio.h>intmain(void){ in......
  • 【ChernoC++笔记】智能指针
    【44】【ChernoC++】【中字】C++的智能指针智能指针(Smartpointers)是C++中的一种特殊类型,用于管理动态分配的内存资源。智能指针通过封装指针,并在适当的时机自动释放内存,从而避免内存泄漏和悬空指针等常见问题。unique_ptr❓为什么叫做uniqueptr?unique_ptr不能复制:如果复......
  • CTFer成长记录——CTF之Web专题·初识反序列化
    一、题目链接http://122.114.252.87:1110/index2.php前置知识:序列化与反序列化序列化是将变量转换成可保存或传输的字符串,实现函数是:serialize();反序列化是:将字符串转换成变量,是一个逆过程。实现的函数式:unserialize();序列化:上面的结果是对一个对象的打印,后面是序列化......
  • 你需要知道关于C语言指针的一切
    EverythingyouneedtoknowaboutpointersinC你需要知道关于C语言指针的一切指针的定义指针是内存地址。(嗯,简短的段落。)开始假设你声明一个名为foo的变量。foo;这个变量占用一些内存。在当前主流的Intel处理器上,它占用四个字节的内存(因为int是四个字节宽)。现在......
  • 【AGC】云数据库开发常见问题汇总
    ​ 【问题背景】近期越来越多的开发者通过SDK使用云数据库,云数据库是一款支持端云数据协同管理、可扩展的Serverless数据库产品,提供简单易用的多平台原生SDK,您的应用可以通过SDK直接访问云侧数据库。同时,云数据库还支持通过ServerSDK直接管理云侧数据,实现云侧数据的高效管理。......
  • 文件位置指针
     istream 和 ostream 都提供了用于重新定位文件位置指针的成员函数。这些成员函数包括关于istream的 seekg("seekget")和关于ostream的 seekp("seekput")。seekg和seekp的参数通常是一个长整型。第二个参数可以用于指定查找方向。查找方向可以是 ios::beg(默认的,从流......
  • 指针
    指针在我的理解中,指针是用来存放地址的。指针也有大小,对于不同类型的指针char,short,int,,,double,它们的指针大小都是8个字节,对于64位机器是这样的,而对于32位机器它们的指针大小都为4个字节。我的是64位操作系统:#include<stdio.h>intmain(){ printf("%zd\n",sizeof(char*)); ......
  • Java空指针异常优雅处理的方式
    1原因如下:由于Java开发过程中一不注意就会造成空指针异常,但是如果要避免这些空指针异常我们就可能需要写如下啰嗦有无聊的语句:if(test!=null&&test.size()>0){..............}为了避免写这些无聊的语句和避免NPE错误,我们可以用如下用法进行替代。......
  • 现代C++(Modern C++)基本用法实践:五、智能指针(Smart Pointers)
    概述c++效率较高的一个原因是我们可以自己定制策略手动申请和释放内存,当然,也伴随着开发效率降低和内存泄漏的风险。为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,有三种:std::unique_ptr是一种独占所有权的智能指针,它不允许多个指针指向同一个对......