指针基础

简介: 指针基础

指针基础

指针是C语言中一个非常重要的概念,它允许程序直接访问和操作内存地址。下面将深入剖析指针的概念、声明、赋值及指针运算。

一、指针的概念

在计算机的内存中,每一个字节单元(可存储8个bit的数据)都有一个独特的编号,即地址。内存单元使用这个地址来标识自身的位置,而内存单元的地址就称作指针。专门用来存放内存单元地址的变量,称为指针变量。在不影响理解的情况下,常对地址、指针和指针变量不作区分,统称为指针。

二、指针的声明

指针变量和其他变量一样,使用之前需要先进行定义。指针的声明需要指定指针所指向的数据类型。例如:

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

float *q; // 声明一个指向浮点型数据的指针变量q

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

在声明中,*是类型说明符的一部分,表示该变量是一个指针变量,而变量名前的类型说明符(如int、float、char)则指定了指针所指向的数据类型。

三、指针的赋值

指针变量的赋值只能赋予地址,不能赋予任何其他数据,否则将引起错误。在C语言中,可以使用地址运算符&来获取变量的地址,并将其赋给指针变量。例如:

int a = 10;

int *p = &a; // 将变量a的地址赋给指针变量p

指针变量也可以在声明时直接初始化,如:

int a = 10, *p = &a;

或者将一个指针变量的值赋给另一个指向相同类型数据的指针变量,如:

int b = 20, *pa = &a, *pb = pa; // pb也指向a

四、指针的运算

指针变量可以进行某些运算,但其运算的种类是有限的,主要包括赋值运算、算术运算和关系运算。

算术运算:

指针加1:表示指针所指向的地址加上sizeof(指针所指数据类型)的地址。例如,如果p是指向整型数组的指针,则p+1指向数组中下一个整型元素的位置。

指针加(减)整数n:将指针向前(或向后)移动n个数据元素的位置。

指针自增(++)和自减(--)运算:使指针向前或向后移动一个数据元素的位置。

指针相减:两个指向同一数组(或同一块连续内存区域)的指针相减,结果是它们之间相隔的元素个数。

关系运算:

指针之间可以使用<、<=、>、>=、!=、==等关系运算符进行比较。这种比较实质上是地址大小的比较。

解引用:

使用*运算符可以解引用指针,即获取指针所指向地址中的值。例如,*p就是获取指针p所指向地址中的值。

注意事项

指针变量在定义后必须初始化或赋值,否则使用未初始化的指针变量会导致未定义行为,甚至程序崩溃。

指针运算时,要注意指针的类型和它所指向的数据类型,因为指针运算的单位是它所指向的数据类型的大小。

指针变量之间不能直接进行算术运算(如相加、相乘等),除非它们指向同一数组或同一块连续内存区域,并且进行的是合法的指针算术运算。

指针和数组在C语言中有密切关系,指针可以指向数组的首地址,并通过指针访问数组元素。

通过深入理解和掌握指针的这些基本概念和运算规则,可以更好地利用C语言进行高效的内存管理和数据操作。

 

 

在深入探讨C语言中的指针概念、声明、赋值及运算时,我们首先需要明确指针在计算机内存管理中的核心地位。指针是C语言乃至众多编程语言中一项极为强大的工具,它允许程序直接访问和操作内存地址,从而实现对复杂数据结构的直接管理和操作。以下是对指针技术的详细解析,包括代码示例和技术性内容。

一、指针的概念

在计算机的内存中,每一个字节单元(可存储8个bit的数据)都有一个独特的编号,即地址。内存单元通过这个地址来标识自身的位置,而内存单元的地址就被称为指针。专门用来存放内存单元地址的变量,称为指针变量。在编程中,我们通常对地址、指针和指针变量不做严格区分,统称为指针。

二、指针的声明

指针变量在声明时需要指定其指向的数据类型。这是因为在C语言中,不同类型的数据占用的内存空间大小不同,因此指针在运算时(如指针加1)需要知道其指向的数据类型大小,以便正确地移动指针。指针的声明语法如下:

类型名 *指针变量名;

例如:

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

float *q; // 声明一个指向浮点型数据的指针变量q

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

在这里,*是类型说明符的一部分,表示该变量是一个指针变量,而变量名前的类型说明符(如int、float、char)则指定了指针所指向的数据类型。

三、指针的赋值

指针变量的赋值只能赋予地址,不能赋予任何其他数据,否则将引起编译错误或运行时错误。给指针变量赋值的方法主要有两种:

 

直接通过地址运算符&获取变量的地址:

 

int a = 10;

int *p = &a; // 将变量a的地址赋给指针变量p

 

 

在声明时直接初始化:

 

int a = 10, *p = &a; // 声明整型变量a并初始化,同时声明并初始化指向a的指针p

 

或者,将一个指针变量的值赋给另一个指向相同类型数据的指针变量:

 

int b = 20, *pa = &a, *pb = pa; // pb也指向a

 

四、指针的运算

指针变量可以进行某些运算,但其运算的种类是有限的,主要包括赋值运算、算术运算和关系运算。

1. 赋值运算

赋值运算是最简单的指针运算,即将一个地址值赋给指针变量。

int *p, a = 10;

p = &a; // 将变量a的地址赋给指针p

2. 算术运算

指针的算术运算主要包括指针加(减)整数、指针自增(++)和自减(--)、指针相减。

 

指针加 1:表示指针所指向的地址加上sizeof(指针所指数据类型)的地址。

 

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

int *p = arr; // p指向arr的第一个元素

p++; // p现在指向arr的第二个元素

 

 

指针加(减)整数 n:将指针向前(或向后)移动n个数据元素的位置。

 

p = p + 2; // p现在指向arr的第三个元素

p = p - 1; // p现在指回arr的第二个元素

 

 

指针相减:两个指向同一数组(或同一块连续内存区域)的指针相减,结果是它们之间相隔的元素个数。

 

int *start = arr;

int *end = arr + 4; // 指向arr的最后一个元素

int length = end - start; // 长度为4,即两指针之间相隔的元素个数

 

3. 关系运算

指针之间可以使用<、<=、>、>=、!=、==等关系运算符进行比较。这种比较实质上是地址大小的比较。

int *p1 = arr;

int *p2 = arr + 2;

if (p1 < p2) {

printf("p1 is less than p2\n");

}

五、指针的高级应用

指针的强大之处在于

 

相关文章
|
网络协议 网络架构
OSI 模型和 TCP/IP 模型的异同
OSI 模型和 TCP/IP 模型的异同
895 1
|
域名解析 存储 缓存
阿里云服务器带宽怎么选?巧用负载均衡节省带宽费用技巧与注意事项参考
在选购阿里云服务器的过程中,设定合适的云服务器带宽是必不可少的一步。为了确保云服务器带宽的稳定性,用户通常会倾向于选择固定带宽,比如1Mbps、3Mbps、10Mbps或是20Mbps等规格。不过,在挑选云服务器带宽的过程中,众多用户常常会陷入一个两难的境地:怎样做才能在确保云服务器稳定运行的同时,又能够合理控制成本支出呢?本文将为大家介绍一种借助阿里云负载均衡产品来节省带宽费用的方法,以供参考借鉴。
|
机器学习/深度学习 人工智能 Ubuntu
|
安全 调度 C++
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)(二)
C++ std::chrono库使用指南 (实现C++ 获取日期,时间戳,计时等功能)
1777 0
|
机器学习/深度学习 自然语言处理 测试技术
模型上新!来通义灵码体验 QwQ-32B 推理模型!
今天,阿里云发布并开源全新的推理模型通义千问QwQ-32B。通过大规模强化学习,千问QwQ-32B在数学、代码及通用能力上实现质的飞跃,整体性能比肩DeepSeek-R1。在保持强劲性能的同时,千问QwQ-32B还大幅降低了部署使用成本,在消费级显卡上也能实现本地部署。
3315 58
|
机器学习/深度学习 人工智能 算法
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
RAGEN是一个基于StarPO框架的开源强化学习系统,通过马尔可夫决策过程形式化Agent与环境的交互,支持PPO、GRPO等多种优化算法,显著提升多轮推理训练的稳定性。
1910 5
RAGEN:RL训练LLM推理新范式!开源强化学习框架让Agent学会多轮决策
|
人工智能 图形学
PhysGen3D:清华等高校联合推出,单图秒变交互式3D场景
PhysGen3D是清华等高校联合开发的创新框架,通过单张图像重建3D场景并模拟物理行为,实现从静态图像到动态交互的突破性转换。
673 15
PhysGen3D:清华等高校联合推出,单图秒变交互式3D场景
|
人工智能 算法 物联网
ComfyUI:搭积木一样构建专属于自己的AIGC工作流(保姆级教程)
通过本篇文章,你可以了解并实践通过【ComfyUI】构建自己的【文生图】和【文生动图】工作流。
25915 5
ComfyUI:搭积木一样构建专属于自己的AIGC工作流(保姆级教程)
UE4 动画蓝图中两类动画曲线的使用
UE4 动画蓝图中两类动画曲线的使用
659 1
UE4 动画蓝图中两类动画曲线的使用
|
机器学习/深度学习
知识蒸馏技术原理详解:从软标签到模型压缩的实现机制
**知识蒸馏**是一种通过性能与模型规模的权衡来实现模型压缩的技术。其核心思想是将较大规模模型(称为教师模型)中的知识迁移到规模较小的模型(称为学生模型)中。本文将深入探讨知识迁移的具体实现机制。
2189 12
知识蒸馏技术原理详解:从软标签到模型压缩的实现机制

热门文章

最新文章