《c和指针》笔记6

一维数组

  首先是对于声明的变量的解释,代码如下:

int a;
int b[10];

  a是一个标量(原先我也是不晓得为什么叫做标量),因为a是一个单一的值,b是数组,是一些值的集合。数组名是一个指向该数组内第一个元素类型的指针,但是数组跟指针是存在一些区别的。

  1、数组是能确数量的元素。

  2、数组名是常量指针,而指针是一个标量。

  *在作为sizeof操作符和&操作符的操作数时,数组名不用指针常量来表示。

1 int a[10];
2 int b[10];
3 int *c;
4 ...
5 c = &a[0];
6 b = a;
7 a = c;

  第5行是合法的,c为指向数组a第一个元素的指针,前面我们说到数组名是指向数组内第一个元素的常量指针,因此表达式等于c = a.

  第6行是非法的,因为我们不能直接将一个数组的所有元素复制给另一个数组,必须通过循环对于数组内的元素一个个复制。

  第7也是非法的,因为数组名在表达式中是一个常量指针,常量是不能能被修改的。

下标引用

*(a + 3)

  该表达式的结果相当于a[3]。因为a的值是指向整型的指针,对a进行加法运算的结果是a所指向的数组的第一个元素向后移动3个整型长度的位置。

  因此我们可以的得出array[subscript] = *(a + (subscript))。以下有个例子来说明:

复制代码
int array[10];
int *ap = array + 2;

ap == &array[2];//从初始化得出ap是指向数组向后移动2个整型长度的位置
*ap == *(array + 2) == array[2];
ap[0] == *(ap + 0) == array[2]//从上一个表达式我们可以推导出来
ap + 6 == array + 8 == &array[8]//因为ap原本就是指向数组内第3个元素的位置,因此向后移动6个整型长度的位置便是第9个元素的位置
*ap + 6 == array[2] + 6//这里要注意,因为运算顺序是从右往左的也就是6加上ap间接取址后的值
*(ap + 6) == array[8]//不解释
ap[6] == *(ap + 6) == &array[8]//从ap[0]我们可以推导出
&ap//array没有与之相等的表达式,因为我们不能确定ap相对于array处于何种位置
ap[-1] == *(ap - 1) == array + (2 - 1) == &array[1]
ap[9]//按照运算的出应该与array[11]相等 但是已经超出了数组的长度
复制代码

  

  今天就到这里,明天继续,加油!

posted @   ahl5esoft  阅读(211)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示