【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数2

简介: 【C语言】 数组:-- 一维数组 -- 二维数组 -- 数组越界 -- 数组作为函数的参数2

我们来想想 string 的特点与 sizeof 的特点:


1.string 是一个库函数,是用来计算字符串长度的。它只针对字符串的 '\0' 前的字符。


2.sizeof 是单目操作符(运算符),是用来求类型或者变量所占空间大小(单位是字节)。它是对任何类型都可以进行计算,只管空间大小。


以此为基础,我们再来对这段代码进行分析:



因此打印出来的值就是4 3,3 乱码。

我们可以对两个数组进行打印一下再看看效果:

字符串的结束标志是 '\0' ,而arr1并没有 '\0' ,所以打印出来就是乱码。

2.3 一维数组的使用

对于数组的使用,我们之前介绍了一个操作符:[ ],下标引用操作符。它其实就是数组访问的操作符。

我们来看看代码:

#include <stdio.h>
int main()
{ 
  int arr[10] = { 0 };//数组的不完全初始化,这里的[]是语法
  //计算数组的元素个数
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;//做下标
  for (i = 0; i < 10; i++)
  {
    arr[i] = i;//这里的[]才是操作符
  }
  //输出数组内容
  for (i = 0; i < 10; i++)
  {
    printf("%d ", arr[i]);
  }
  return 0;
}

我们在展示效果之前来想想下面的知识:

2.3.1 数组的下标

下标是用来访问元素的

int arr[10] = { 1,2,3,4,5,6,7,8,9,0 };
//下标      0 1 2 3 4 5 6 7 8 9

数组的大小可以用 sizeof 来求

int sz = sizeof(arr) / sizeof(arr[0]);
//        40   /   4

基于以上知识,我们对代码进行分析


2.4 一维数组在内存中的存储

我们来看代码

#include <stdio.h>
int main()
{ 
  int arr[10] = { 0 };
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("arr[%d] = %p\n", i, &arr[i]);
  }
  return 0;
}

效果展示:

int 是整形,一个整形是 4 个字节,每次加一都是跳过一个整形(4个字节),所以地址每次都是加 4 。

仔细观察输出的结果,我们知道,随着数组下标的增长,元素的地址,也在有规律的增长:

一维数组在内存中是连续存放的,地址会随下标的增长而增长。

我们再看一段代码

#include <stdio.h>
int main()
{ 
  int arr[10] = { 0 };
  int* p = &arr[0];
  int i = 0;
  for (i = 0; i < 10; i++)
  {
    printf("%p == %p\n", p+i, &arr[i]);
  }
  return 0;
}

效果展示:

我们可以看到两种取地址的方法取出的地址是一样的,这是为什么呢?

A:p 取出来的地址是数组首元素的地址,p 的类型是 int (整形),+1相当于跳过了四个字节,所以和使用下标访问操作符取出的地址是一致的。

总结:定义的是什么类型的指针,+1就跳过一个什么类型的元素(对应跳过类型一个字节)。

如果我们对 p+i 解引用操作就会找出相对应位置的元素

效果展示:


相关文章
|
10月前
|
存储 人工智能 Java
一文彻底搞定C语言中的二维数组
本文详细介绍了C语言中的多维数组,包括二维和三维数组的定义、初始化方式、内存布局及遍历方法。通过具体示例讲解了多种赋值技巧,并强调了数组在内存中按行存放的特点。希望这些内容能帮助你在编程路上不断成长!君志所向,一往无前!
751 1
一文彻底搞定C语言中的二维数组
|
10月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
515 0
一文彻底搞明白C语言的数组
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
883 6
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
359 5
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
算法 编译器 程序员
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
C语言学习笔记(数组<2>+图解+题例+三子棋游戏<初级>)
232 0
C语言学习笔记—P11(数组<2>+图解+题例+三子棋游戏<初级>)
|
存储 C语言
C语言学习笔记—P10(数组<1>+图解+题例)
C语言学习笔记(数组<1>+图解+题例)
288 0
C语言学习笔记—P10(数组<1>+图解+题例)
|
C语言
C语言学习笔记——数组(二)
C语言学习笔记——数组
321 0
C语言学习笔记——数组(二)
|
C语言
C语言学习笔记——数组(一)
C语言学习笔记——数组
244 0
C语言学习笔记——数组(一)
|
机器学习/深度学习 C语言 编译器
【C语言】学习笔记4——数组
我直接把控制语句和循环跳过了。大致看了一下,讲得太繁琐了。这部分在后面用C写数据结构就可以练得很熟了。 1. 数组: 由数据类型相同得一系列元素组成。内存上是一片连续得存储单元。 2. 声明 int nums[5] // 内含5个int类型元素的数组 float ...
1046 0