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

C语言指针

时间:2025-01-03 16:33:17浏览次数:3  
标签:arr 指向 int C语言 数组 声明 指针

一、指针的基本概念

 

1. 定义

 

- 指针是C语言中的一个重要概念,它是一个变量,其值为另一个变量的地址。简单来说,指针“指向”了内存中的某个位置,这个位置存放着其他变量的值。

- 例如:

c

int a = 10;

int *p; // 声明一个指向int类型的指针

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

 

- 这里 & 是取地址运算符, p = &a 表示把变量 a 的地址赋给指针 p 。

2. 指针的声明和初始化

 

- 声明指针的一般形式是: 类型 *指针变量名; 

- 例如: float *fp; 声明了一个指向 float 类型的指针 fp 。

- 指针的初始化可以在声明时进行,也可以在声明后进行:

- 声明时初始化:

c

int x = 5;

int *px=&x;

 

- 声明后初始化:

c

int y = 10;

int *py;

py = &y;

 

 

二、指针的运算

 

1. 算术运算

 

- 指针的算术运算主要包括加法和减法。

- 当指针加1或减1时,它实际移动的字节数取决于它所指向的数据类型。例如,对于一个指向 int 类型(假设 int 占4个字节)的指针 p , p + 1 会使指针移动4个字节,因为它要指向下一个 int 类型的存储位置。

c

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

int *p = arr; // 此时p指向arr[0]

p++; // 此时p指向arr[1]

 

- 两个指针相减可以得到它们之间相隔的元素个数(前提是这两个指针指向同一个数组中的元素)。例如:

c

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

int *p1 = &arr[1];

int *p2 = &arr[3];

int diff = p2 - p1; // diff的值为2

 

2. 关系运算

 

- 指针可以进行关系运算(如 > 、 < 、 == 、 != ),通常用于比较两个指针是否指向同一个地址或者判断指针在数组中的相对位置。

- 例如:

c

int a = 10, b = 20;

int *pa=&a, *pb=&b;

if(pa < pb) {

  // 如果a的地址小于b的地址,执行这里的代码

}

 

 

三、指针与数组

 

1. 数组名与指针的关系

 

- 在C语言中,数组名可以看作是一个常量指针,它指向数组的第一个元素。

- 例如:

c

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

int *p = arr; // 等价于int *p=&arr[0];

 

- 可以通过指针来访问数组元素:

c

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

int *p = arr;

printf("%d", *p); // 输出1,即arr[0]

printf("%d", *(p + 2));// 输出3,即arr[2]

 

2. 指针数组和数组指针

 

- 指针数组:是一个数组,其元素是指针。例如: int *arr[5]; 声明了一个包含5个元素的数组,每个元素都是指向 int 类型的指针。

- 数组指针:是一个指针,它指向一个数组。例如: int (*p)[5]; 声明了一个指针 p ,它指向一个包含5个 int 类型元素的数组。

 

四、指针与函数

 

1. 函数参数传递

 

- 指针可以作为函数的参数进行传递,这在C语言中常用于在函数中修改外部变量的值。

- 例如:

c

void swap(int *a, int *b) {

  int temp = *a;

  *a = *b;

  *b = temp;

}

int main() {

  int x = 5, y = 10;

  swap(&x, &y);

  printf("x = %d, y = %d\n", x, y);

  return 0;

}

 

- 在 swap 函数中,通过指针来交换 x 和 y 的值。

2. 函数返回指针

 

- 函数可以返回指针类型的值。例如:

c

int *createArray(int size) {

  int *arr = (int *)malloc(size * sizeof(int));

  return arr;

}

int main() {

  int *p = createArray(5);

  // 使用p指向的数组

  free(p); // 记得释放内存

  return 0;

}

 

- 这里 createArray 函数返回一个指向动态分配的整数数组的指针。注意,当函数返回指针时,要确保指针所指向的内存是合法有效的,并且在不需要时及时释放动态分配的内存。

标签:arr,指向,int,C语言,数组,声明,指针
From: https://blog.csdn.net/2301_81152393/article/details/144843371

相关文章

  • C中如何理解指针和引用的区别?
    在C语言中,指针和引用是两个重要的概念,它们都与内存地址和变量之间的关系有关,但它们在定义、使用和特性上存在显著的区别。下面将详细解释指针和引用的区别,并通过示例代码进行说明。指针的基本概念指针是一种变量,其值为另一个变量的地址,即内存位置。通过使用星号(*)声明指针变量......
  • STLG_01_07_程序设计C语言 - 语句与控制流
    1.基本语句1.1表达式语句表达式语句由一个表达式加上分号组成。例如:x=5;、i++;1.2复合语句(块语句)复合语句是由一对大括号 {} 包围的一组语句。复合语句可以包含变量声明、表达式语句等。例如:{intx=5;x=x+1;}1.3空语句空语句只包含一个分号......
  • 2. C语言 基础语法
    本章目录:前言1.C语言的基础结构1.1C程序的基本构成1.2一个简单的C程序实例1.3复杂的C程序结构2.C语言的基本构成单元2.1关键字标准关键字C99新增关键字C11新增关键字2.2标识符2.3常量2.4注释3.语句与表达式3.1语句3.2表达式4.分隔符与空格4.1......
  • 3. C语言 数据类型
    本章目录:前言:C语言中的数据类型分类1.基本数据类型1.1整数类型1.2浮点类型1.3字符型常量1.4字符串常量2.枚举类型3.void类型void类型的使用示例:4.类型转换4.1隐式类型转换4.2显式类型转换类型转换的注意事项5.小结前言:C语言是一种强类型语言,其中每......
  • 1. C语言程序结构与编译执行
    本章目录:前言C程序的基本结构示例代码代码解析编译和运行C程序保存源代码编译源代码运行可执行文件注意事项目标文件路径和名称避免程序一闪而过使用批处理文件避免闪退总结前言在深入学习C语言编程之前,了解其基本构建块和程序结构是非常重要的。本文将详细介绍......
  • 使用指针操作Jobs示例
    用指针传入Jobs操作对于外部类型为传统数据类型的集合来说效率是比较高的,以下是示例代码: usingSystem;usingSystem.Runtime.InteropServices;usingUnity.Jobs;usingUnity.Burst;usingUnity.Collections.LowLevel.Unsafe;usingUnityEngine;publicclassTestClass......
  • 206翻转指针
    使用双指针法,注意一下更新左右指针的顺序就好了。这里还要注意一下终止条件,画个图就行了。leetcode里面头节点就是第一个存储数据的节点,没有虚拟头节点classSolution{public:ListNode*reverseList(ListNode*head){ListNode*left;ListNode*right;......
  • 基于C语言的卡丁车管理系统【控制台应用程序】
    注意:需要提前创建对应的.dat文件本项目实现了数据的永久存储,有用户的注册、登录。管理员对卡丁车的管理、查看预约用户、修改帐户权限。用户对个人信息的管理、查看并预约卡丁车、卡丁车维修上报。维修员对卡丁车的维修状态上报、个人信息管理。登录信息页面login.h/......
  • 2025/1/2 【双指针法】LeetCode27.移除元素 【√】 ❗未完结❗
    27.移除元素-力扣(LeetCode)代码随想录数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。Myanswer:快慢指针法classSolution:defremoveElement(self,nums:List[int],val:int)->int:n=len(nums)j=0forii......
  • 【优选算法】查找总价格为目标值的两个商品(双指针)
    算法_云边有个稻草人的博客-CSDN博客目录解法一:暴力算法解法二:双指针(时间复杂度为O(N))【代码编写】LCR179.查找总价格为目标值的两个商品-力扣(LeetCode)解法一:暴力算法用两个for循环,列出所有的两个数的和进行判断,时间复杂度为O(N^2),不推荐。算法流程:两层......