首页 > 其他分享 >C语言基础:指针

C语言基础:指针

时间:2024-07-11 22:56:20浏览次数:15  
标签:arr 变量 指向 int 基础 C语言 ptr 指针

1 指针的基本概念

1.1 变量的地址

在计算机内存中,每个变量都有一个唯一的内存地址,指针是存储这些地址的特殊变量。换句话说,指针是一个变量,其值为另一个变量的地址。

1.2 指针的声明和赋值

在 C 语言中,使用指针需要以下基本操作:

  • 声明指针:使用 * 符号声明指针变量,指定指针所指向数据的类型。
  • 获取地址:使用 & 运算符获取变量的地址,并将地址赋给指针变量。
  • 间接访问:使用 * 运算符(解引用运算符)可以访问指针所指向的数据。
int *ptr;  // 声明一个指向整数的指针
int x = 10;
ptr = &x;  // 将 x 的地址赋给指针 ptr
printf("Value of x: %d\n", *ptr);  // 输出 ptr 指向的变量的值

2 指针的偏移

指针的偏移是指改变指针指向的地址,使其指向另一个位置。在 C 语言中,可以通过对指针进行加法或减法运算来实现偏移。

2.1 指针的加法和减法

  • 指针加法:将指针向前移动若干个单位,单位大小由指针所指向的数据类型决定。
int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;  // 指向数组首元素的指针
ptr = ptr + 2;   // 将指针移动两个整数位置

上述代码中,ptr最初指向数组 arr 的第一个元素,经过 ptr = ptr + 2; 操作后,ptr 指向数组 arr 的第三个元素(arr[2])。

  • 指针减法:将指针向后移动若干个单位。
int *ptr_end = &arr[4];  // 指向数组最后一个元素的指针
ptr_end = ptr_end - 1;    // 将指针向前移动一个整数位置

上述代码中,ptr_end 最初指向数组 arr 的最后一个元素,经过 ptr_end = ptr_end - 1; 操作后,ptr_end 指向数组 arr 的倒数第二个元素(arr[3])。

2.2 指针偏移与数组元素访问

指针的偏移常用于访问数组中的元素,通过指针加法和解引用操作可以方便地访问数组的任意位置。

int arr[5] = {10, 20, 30, 40, 50};
int *ptr = arr;  // 指向数组首元素的指针

// 访问数组第三个元素
int third_element = *(ptr + 2);  // 等价于 arr[2]

3 指针的传递

指针的传递是指将指针作为参数传递给函数,或者将指针赋值给另一个指针变量。

3.1 将指针作为函数参数传递

通过将指针作为函数参数,可以在函数内部直接访问和修改指针所指向的数据。

void increment(int *ptr) 
{
    (*ptr)++;  // 递增指针所指向的整数值
}

int main() 
{
    int num = 10;
    int *ptr = #

    increment(ptr);  // 将指针传递给函数

    printf("Updated value: %d\n", *ptr);  // 输出递增后的值

    return 0;
}

3.2 将指针赋值给另一个指针变量

可以将一个指针的值(即指向的地址)赋给另一个指针变量,从而使两个指针指向同一块内存区域。

int x = 10;
int *ptr1 = &x;
int *ptr2;

ptr2 = ptr1;  // 将 ptr1 的值(即 x 的地址)赋给 ptr2

printf("Value through ptr1: %d\n", *ptr1);  // 输出通过 ptr1 访问的值
printf("Value through ptr2: %d\n", *ptr2);  // 输出通过 ptr2 访问的值

4 注意事项

使用指针需要注意以下事项:

  • 指针本身也占内存,在64位系统任何类型的指针都占8字节
  • 空指针:指针变量可以指向空地址(NULL),表示不指向任何有效的内存对象。
  • 野指针:未初始化或已经释放的指针称为野指针,使用野指针可能导致程序崩溃或不可预测的行为。
  • 指针运算:指针支持加法、减法等运算,但需要小心防止越界访问和非法操作。
  • 指针类型:指针的类型必须与其指向的数据类型相匹配,否则可能导致类型不匹配的错误。
    指针的偏移和传递是指针操作中常见且重要的概念,对于理解和使用指针非常有帮助。指针的偏移涉及到指针地址的增减,而指针的传递则涉及将指针作为参数传递给函数或复制给另一个指针变量。让我们分别来看这两个方面的详细解释。

标签:arr,变量,指向,int,基础,C语言,ptr,指针
From: https://blog.csdn.net/wy2458984254/article/details/140363958

相关文章

  • ‘AI’第二课堂笔记记录(python基础)
    一、miniconda下载链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Windows-x86_64.exe或者去清华大学开源软件镜像站下载https://mirrors.tuna.tsinghua.edu.cn/(开始下载程序后勾选添加到环境变量,一直下一步即可)使用创建环境condacre......
  • 深度学习基础与实战:Python实现
    深度学习基础与实战:Python实现深度学习是机器学习的一个重要分支,通过多层神经网络实现对数据的自动特征提取和建模。本文将介绍深度学习的基础概念、常用框架以及一个完整的实战项目,帮助读者从基础入门到实际应用。目录深度学习概述深度学习基础神经网络结构前向传播......
  • 【爬虫】爬虫基础
    目录一、Http响应与请求1、Http请求2、Http响应3、状态码二、Requests库1、发起GET请求2、发起POST请求3、处理请求头三、BeautifulSoup库1、解析HTML文档2、查找和提取数据Ⅰ、查找单个元素Ⅱ、查找所有元素Ⅲ、使用CSS选择器Ⅳ、获取元素属性四、爬取豆瓣电影榜......
  • 《0基础》轻松学会Python——第五讲
    第五讲一、转义字符(\n,\t,\',\\,\r)    1、\n :表示换行符print('人生若只如初见,何事秋风悲画扇')print('*'*50)print('人生若只如初见,\n何事秋风悲画扇')        2、\t  :制表符,即tab键print('人生而自由,却无往不在枷锁中')print('人生而自由,却无......
  • 卡尔曼滤波Kalman Filter零基础入门到实践(上部)
    参考视频:入门(秒懂滤波概要)_哔哩哔哩_bilibili一、入门1.引入假设超声波距离传感器每1ms给单片机发数据。理论数据为黑点,测量数据曲线为红线,引入滤波后的数据为紫线引入滤波的作用是过滤数据中的噪声,使信号更趋于真实值。2.卡尔曼滤波适用系统卡尔曼滤波适用于线性高斯......
  • 持续基础怎么搞?Jenkins+Docker+Git实战
     在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要。目前已经形成一套标准的流程,最重要的组成部分就是持续集成(ContinuousIntegration,CI)及持续部署、交付(CD)。在此,我们来以一个案例初步了解CI流程。那么什么是CI呢?简单来讲,CI就是将......
  • C语言大端存储和小端存储到底有什么区别? 结尾详细题目加深理解
    一.为什么有大端小端模式?        大端模式(Big-endian)和小端模式(Little-endian)是计算机科学中数据存储的一种方式,它们指的是多字节数据类型(如整数、浮点数等)在内存中的字节序(byteorder)。这两种模式的主要区别在于数据的最高有效字节(MSB)和最低有效字节(LSB)的存储位置。......
  • Rocky Linux基础设置
    1、本地yum源rm-rf/etc/yum.repos.d/*cat<<'EOF'>/etc/yum.repos.d/rocky.repo[baseos]name=RockyLinux$releasever-BaseOSbaseurl=https://mirrors.aliyun.com/rockylinux/$releasever/BaseOS/$basearch/os/gpgcheck=1enabled=1gpgkey=fil......
  • Java基础,面向对象,类与对象,全局和局部变量,三大特征--封装,构造方法,JavaBean的编写---入
    一.面向对象面向过程和面向对象的区别     面向过程:强调步骤    面向对象:强调对象,对象洗衣机帮我们完成举例:洗衣服面向过程:面向对象:脱衣服->打开洗衣机->按钮->晾衣服面向对象的三大特征-----封装,继承,多态对象:万物皆可对象类:一组相关属性和行为的集......
  • 【逆向基础】九、dnSpy使用技巧随记
    一、dnSpy逆向工具的使用1、反汇编适用范围:C#,.NET等语言编写的程序2、工具的获取:dnSpy(ps:大家可自行去网页搜索下载最新版)3、打开需要反汇编的程序,成功后出现如图所示的界面4、dnSpy反汇编.NET程序后,可以像开发一样对目标程序进行调试,所以我们根据自己的喜好,设置对......