理解数组指针

本文通过C语言代码实例,解释了一维数组指针的概念,展示了如何声明和使用指针,并比较了`p`和`ptr`以及它们指向的内存大小。同时,演示了如何将指针指向多维数组并访问元素。

int (*ptr)[4];  //ptr 是一个指针,指向一个含有 4 个 int 元素的 一维数组 。即ptr 是一个数组指针

举例:

// C program to illustrate pointer of array

#include<stdio.h>

int main()
{
    int arr[] = { 3, 5, 6, 7};
    int *p = arr;
    int (*ptr)[4] = &arr;

    printf("p = %p, ptr = %p\n", p, ptr);
    printf("*p = %d, *ptr = %p\n", *p, *ptr);

    printf("sizeof(p) = %lu, sizeof(*p) = %lu\n",
                        sizeof(p), sizeof(*p));
    printf("sizeof(ptr) = %lu, sizeof(*ptr) = %lu\n",
                        sizeof(ptr), sizeof(*ptr));

    int brr[3][4] = {
                    {10, 11, 12, 13},
                    {20, 21, 22, 23},
                    {30, 31, 32, 33}
                  };

      ptr = brr;
      printf("%p %p %p\n", ptr, ptr + 1, ptr + 2);
      printf("%p %p %p\n", *ptr, *(ptr + 1), *(ptr + 2));
      printf("%d %d %d\n", **ptr, *(*(ptr + 1) + 2), *(*(ptr + 2) + 3));
      printf("%d %d %d\n", ptr[0][0], ptr[1][2], ptr[2][3]);
      return 0;

}
64位系统上运行结果:

p = 000000000061FE00, ptr = 000000000061FE00
*p = 3, *ptr = 000000000061FE00
sizeof(p) = 8, sizeof(*p) = 4
sizeof(ptr) = 8, sizeof(*ptr) = 16
000000000061FDD0 000000000061FDE0 000000000061FDF0
000000000061FDD0 000000000061FDE0 000000000061FDF0
10 22 33
10 22 33

源码来自:https://pan.quark.cn/s/41b9d28f0d6d 在信息技术领域中,jQuery作为一个广受欢迎的JavaScript框架,显著简化了诸多操作,包括对HTML文档的遍历、事件的管理、动画的设计以及Ajax通信等。 本篇文档将深入阐释如何运用jQuery达成一个图片自动播放的功能,这种效果常用于网站的轮播展示或幻灯片演示,有助于优化用户与页面的互动,使网页呈现更加动态的视觉体验。 为了有效实施这一功能,首先需掌握jQuery的核心操作。 通过$符号作为接口,jQuery能够迅速选取DOM组件,例如$("#id")用于选取具有特定ID的元素,而$(".class")则能选取所有应用了某类class的元素。 在选定元素之后,可以执行多种行为,诸如事件监听、样式的变更、内容的更新以及动画的制作等。 关于“一个基于jQuery的图片自动播放功能”,首要任务是准备一组图片素材,这些素材将被整合至一个容器元素之中。 例如,可以构建一个div元素,将其宽度设定为单张图片的尺寸,再借助CSS实现溢出内容的隐藏,从而构建出水平滚动的初始框架。 ```html<div id="slider"> <img src="image1.jpg" alt="Image 1"> <img src="image2.jpg" alt="Image 2"> <!-- 更多图片内容... --></div>```接着,需要编写jQuery脚本以实现图片的自动切换。 这通常涉及到定时器的运用,以设定周期性间隔自动更换当前显示的图片。 通过使用`.fadeOut()`和`.fadeIn()`方法,能够实现图片间的平滑过渡,增强视觉效果。 ```javascript$(document).re...
<think> 嗯,用户的问题是想理解数组指针指针数组的概念。从引用的资料来看,确实是很多学习者容易混淆的概念。用户提供的引用内容非常全面,已经涵盖了定义、声明语法、内存结构和实例代码。 用户可能正在学习C/C++指针的高级用法,或者准备相关面试。从引用[5]提到的“面试必备”可以推测,用户可能有求职需求。这类问题在笔试中经常出现,需要清晰的概念区分。 让我先梳理核心差异点:指针数组本质是数组,元素全是指针数组指针本质是指针,指向整个数组。关键区分点在于运算符优先级——[ ]比*优先级高,所以int *p[10]中p先和[ ]结合形成数组,再和*结合说明元素是指针;而int (*p)[10]中括号强制p先和*结合成指针,再和[ ]结合说明指向数组。 用户特别要求提供“理解方法”,所以不能只讲定义,要给出形象化的记忆技巧。比如用“定语后置”的语言学方法:指针数组=“指针数组”(数组里放指针),数组指针=“数组指针”(指针指向数组)。还可结合声明语法反向拆解:从变量名开始往外读,遇见[]读作“数组”,遇见*读作“指针”。 注意到引用[3]和[4]都提到优先级规则,这点必须强调。另外引用[5]的代码示例很有价值,但用户可能还需要更基础的图解说明。考虑用内存布局图展示:指针数组在栈上是连续存储的多个指针(每个占4/8字节),每个指针指向独立内存块;数组指针则是单个指针变量,指向包含N个元素的连续数组。 用户没有明确说明编程水平,但从提问方式看应该已有指针基础。回答时需要避免重复基础指针知识,重点聚焦在“数组”与“指针”的组合形态差异上。可以补充一个易错点:引用[2]提到int (*p2)[5] = arr;会出错,因为arr是首元素地址而非整个数组地址,这个细节很重要。 最后考虑设计练习题目时,应该包含声明解析、错误修正、应用场景三类。比如第二题针对引用[2]的错误案例,让用户分析原因,这样能强化对数组指针初始化要点的记忆。 </think> 理解数组指针指针数组的关键在于**分析声明语句中的运算符优先级和结合性**。下面是清晰的概念解析和记忆方法: --- ### 📌 核心区别总结 | 类型 | 本质 | 声明示例 | 优先级规则 | 内存模型图示 | |------------|---------------|----------------|-----------------------------|-------------------| | **指针数组** | **数组** | `int *ptr[10]` | `[]`优先级高于`*` | `[ptr0, ptr1, ...]` ➡️ 各自指向不同内存 | | **数组指针** | **指针** | `int (*ptr)[10]` | `()`强制`*`先与`ptr`结合 | `ptr` ➡️ 整个连续数组 | --- ### 🔍 详细解析 #### 1. **指针数组(Array of Pointers)** * **本质**:一个数组,其元素全部是指针类型。 * **声明语法**:`int *p[5];` * **解读**: * `p` 先与 `[5]` 结合 → 表示 `p` 是包含 **5 个元素**的数组 * `int *` 修饰元素类型 → 每个元素是 **指向`int`的指针** * **内存模型**: ```c p[0] → int数据 p[1] → int数据 ... p[4] → int数据 ``` * **应用场景**: * 存储多个字符串(等价于 `char *str_array[10]`) * 动态管理多个独立数据块 #### 2. **数组指针(Pointer to an Array)** * **本质**:一个指针,指向整个数组(而非数组首元素)。 * **声明语法**:`int (*p)[5];` * **解读**: * `(*p)` → 表示 `p` 是一个**指针** * `int [5]` → `p` 指向 **包含 5 个`int`元素的数组** * **内存模型**: ```c p → 整个数组 [ int0, int1, int2, int3, int4 ] ``` * **关键特性**: * 对 `p` 进行 `+1` 操作,地址跳过 **整个数组长度**(如 `5 * sizeof(int)`)[^3][^4] * **初始化要点**: ```c int arr[5] = {1,2,3,4,5}; int (*p)[5] = &arr; // ✅ 正确!取整个数组的地址 int (*p2)[5] = arr; // ❌ 错误!arr 退化为 int* 类型 ``` --- ### 💡 理解技巧 1. **从右向左读声明**(结合优先级): * `int *p[5]` → "p 是数组[5],元素类型是 int 指针" * `int (*p)[5]` → "p 是指针,指向 int 数组[5]" 2. **中文定语法**: * **指针数组** = **指针的**数组(强调数组内容) * **数组指针** = **数组的**指针(强调指向对象) --- ### ️ 常见误区澄清 * **`int *p[5]` vs `int (*p)[5]`**: 前者是 **5 个指针**(总大小 = `5 * sizeof(int*)`),后者是 **1 个指针**(大小 = `sizeof(int*)`)[^1][^4] * **数组名退化问题**: ```c int arr[5]; int *p1 = arr; // ✅ arr 退化为 int*(指向首元素) int (*p2)[5] = &arr; // ✅ p2 的类型是 int(*)[5] ``` --- ### 📝 巩固练习 ```c #include <stdio.h> int main() { // 指针数组示例 int a=1, b=2, c=3; int *ptr_arr[3] = {&a, &b, &c}; // 存储三个int指针 printf("指针数组: %d, %d, %d\n", *ptr_arr[0], *ptr_arr[1], *ptr_arr[2]); // 数组指针示例 int matrix[2][3] = {{1,2,3}, {4,5,6}}; int (*arr_ptr)[3] = matrix; // 指向第一行(含3个int的数组) printf("数组指针: %d\n", arr_ptr[1][2]); // 输出第二行第三列:6 return 0; } ``` **输出**: ``` 指针数组: 1, 2, 3 数组指针: 6 ``` ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值