C语言深度复习【数组和指针】

server/2024/11/12 5:40:20/

目录

一.数组和指针

1.1 数组指针

1.2 指针数组

1.3 函数指针

1.4 const和指针

1.5 sizeof和指针和数组

1.6 strlen和字符数组


一.数组和指针

1.1 数组指针

  • 一个数组指针实际上是指指向数组的指针。当你有一个数组类型作为函数参数时,它在函数内部被当作一个指针来处理。
  • 例如,int (*pArray)[10] 声明了一个指向含有10个整数的数组的指针。
  • [ ] 的优先级要高于*号的,所以必须加上()来保证p先和*结合
  • 通常用于函数参数,以传递整个数组。由于数组在函数参数中退化为指针,返回数组的函数可以返回一个数组指针
int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int (*pArray)[10] = &arr; // pArray是一个指向含有10个整数的数组的指针

1.2 指针数组

  • 一个指针数组是一个数组,其元素是指针。
  • 例如,int *pointerArray[5] 声明了一个包含5个指向整数的指针的数组
  • 当你需要一个可以动态改变其元素的数组时使用,每个元素可以独立地指向不同的数据或内存地址
int numbers[] = {0, 1, 2, 3, 4};
int *pointerArray[] = {&numbers[0], &numbers[1], &numbers[2], &numbers[3], &numbers[4]};

1.3 函数指针

return_type (*pointer_name)(parameter_list);
  • return_type 是函数返回值的数据类型。
  • pointer_name 是指针变量的名称。
  • parameter_list 是函数参数的列表,包括参数的类型和顺序。
#include<stdio.h>int add(int a, int b)
{return a + b;
}int sub(int a, int b)
{return a - b;
}int main()
{int (*function_ptr)(int, int);// 声明一个函数指针function_ptr = add;//将函数指针指向 add 函数printf("%d\n", function_ptr(3, 5));// 通过函数指针调用 add 函数function_ptr = sub;printf("%d\n", function_ptr(3, 5));
}

1.4 const和指针

  • const type *ptr; 表示指针指向的数据是常量,但指针本身可以改变。
  • type *const ptr; 表示指针本身是常量,但可以通过指针修改数据。
  • const type *const ptr; 表示指针本身和指向的数据都是常量。
int main()
{const int num = 10;const int* ptr = &num;// *ptr = 20; // 错误:不能通过指向常量的指针修改数据int num2 = 10;int num3 = 20;int* const ptr1 = &num2;// ptr1 = &num3; // 错误:不能改变指针的值*ptr1 = 30; // 正确:可以通过指针修改数据const int num4 = 10;const int* const ptr2 = &num4;// ptr2 = &some_other_int; // 错误:不能改变指针的值// *ptr2 = 20; // 错误:不能通过指向常量的指针修改数据
}

1.5 sizeof和指针和数组

  • sizeof 对于数组返回整个数组的大小。
  • sizeof 对于指针返回指针本身的大小。
  • 对于指向数组的指针,sizeof 在编译时返回指针的大小,而在运行时返回数组的大小。
  • sizeof 对于指针数组返回整个指针数组的大小。
void func(int arr[10]) 
{printf("%zu\n", sizeof(arr)); // 这里输出的是指针的大小,不是数组的大小
}int main()
{int arr[10];printf("%zu\n", sizeof(arr)); // 输出整个数组的大小,这里是 10 个 int 的大小func(arr);int* p;printf("%zu\n", sizeof(p)); // 输出指针的大小,通常是 4 或 8 个字节int array[10];int(*ptr)[10] = &array;printf("%zu\n", sizeof(*ptr)); // 输出数组的大小printf("%zu\n", sizeof(ptr));  // 输出指针的大小int* arr1[10] ;printf("%zu\n", sizeof(arr1)); // 输出指针数组的大小
}

1.6 strlen和字符数组

size_t strlen(const char *str);

strlen 是 C 语言标准库函数,定义在 <string.h> 头文件中,用于计算一个以空字符 '\0' 结尾的字符串的长度。strlen 函数不计算终止的空字符。

当您有一个字符数组并且该数组存储了一个字符串时,您可以使用 strlen 来获取字符串的长度。

#include <stdio.h>
#include <string.h>int main() {char myString[] = "Hello, World!";size_t length = strlen(myString); // 计算字符串长度,不包括终止的 '\0'printf("长度为: %zu\n", length);return 0;
}

注意事项:

  • strlen 只能用于以空字符 '\0' 结尾的字符串。如果字符数组中没有空字符,strlen 可能会进入无限循环,因为它会尝试找到字符串的结束标志。
  • strlen 函数的时间复杂度是 O(n),其中 n 是字符串的长度,因为它需要逐个字符检查直到找到空字符。

http://www.ppmy.cn/server/108373.html

相关文章

oracle物理存储结构文件详解

文章目录 oracle物理文件结构图① 控制文件&#xff1a;② 数据文件&#xff1a;③ 联机Redo日志文件&#xff1a;④ 参数文件&#xff1a;⑤ 归档文件&#xff1a;⑥ 密码文件&#xff1a; oracle物理文件结构图 Oracle数据库的物理结构由控制文件&#xff08;Control f…

C#性能驱动的内存处理:使用 Span<T> 和 Memory<T> 提升代码效率

本文示例内容&#xff1a; 分割数据&#xff1a;示例中将一个整数数组分割成两个部分&#xff0c;展示了如何使用 Span<T>.Slice 方法来获取数组的不同切片。计算数据&#xff1a;计算数组每个部分的总和&#xff0c;展示了如何利用 Span<T> 来遍历和处理数据。修…

小阿轩yx-Kubernetes存储入门

小阿轩yx-Kubernetes存储入门 前言 数据是一个企业的发展核心&#xff0c;它涉及到数据存储和数据交换的内容。在生产环境中尤为重要的一部分在 Kubernetes 中另一个重要的概念就是数据持久化 Volume。 Volume 的概念 对多数项目而言 数据文件的存储是非常常见的 在 Kube…

VBA技术资料MF180:将某个文件夹中的某类图片导入Word

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

备战秋招60天算法挑战,Day26

题目链接&#xff1a; https://leetcode.cn/problems/jump-game/ 视频题解&#xff1a; https://www.bilibili.com/video/BV1gwYKekEVN/ LeetCode 55. 跳跃游戏 题目描述 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该…

python基础学习(最终篇)

文章目录 JSON的基础使用一. JSON简介二. JSON语法规则三. JSON数据类型四. JSON对象五. JSON数组六. JSON函数1. json.dumps2. json.loads3. json.dump4. json.load5. encode6. decode7. 参数说明 总结 JSON的基础使用 一. JSON简介 JSON(JavaScript Object Notation) 是一种…

比特币牛市将至背后

作者&#xff1a;Arthur Hayes 编译&#xff1a;Liam 「此处所表达的任何观点均为作者个人意见&#xff0c;不应作为投资决策依据&#xff0c;也不应被视为参与投资交易的推荐或建议。」 我打破常规&#xff0c;前往南半球滑雪两周&#xff0c;为北半球的暑假画上圆满的句号。我…

模拟登录页,华为账号一键登录

一、介绍 基于鸿蒙Next模拟账号一键登录&#xff0c;免去账号注册环节二、场景需求 1. 用户场景 新用户&#xff1a; 需要快速注册并登录&#xff0c;以体验华为的服务。 老用户&#xff1a; 希望快速登录&#xff0c;不用每次输入用户名和密码。 2. 界面设计 Logo和标题&#…