菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

C 指针和数组


指针与数组

您也可以使用指针来访问 数组

考虑下面的整数数组

示例

int myNumbers[4] = {25, 50, 75, 100};

您从 数组章节 中了解到,您可以使用 for 循环遍历数组元素

示例

int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", myNumbers[i]);
}

结果

25
50
75
100
自己动手试一试 »

与其打印每个数组元素的值,不如打印每个数组元素的内存地址

示例

int myNumbers[4] = {25, 50, 75, 100};
int i;

for (i = 0; i < 4; i++) {
  printf("%p\n", &myNumbers[i]);
}

结果

0x7ffe70f9d8f0
0x7ffe70f9d8f4
0x7ffe70f9d8f8
0x7ffe70f9d8fc
自己动手试一试 »

注意,每个元素的内存地址的最后一位数字都不同,增加了 4。

这是因为 int 类型的大小通常是 4 字节,还记得吗?

示例

// 创建一个 int 变量
int myInt;

// 获取 int 的内存大小
printf("%lu", sizeof(myInt));

结果

4
自己动手试一试 »

所以从上面的“内存地址示例”中,您可以看到编译器为每个数组元素保留了 4 字节的内存,这意味着整个数组占用了 16 字节(4 * 4)的内存存储空间

示例

int myNumbers[4] = {25, 50, 75, 100};

// 获取 myNumbers 数组的大小
printf("%lu", sizeof(myNumbers));

结果

16
自己动手试一试 »

指针与数组有什么关系?

好的,那么指针和数组有什么关系呢?在 C 语言中,数组的名称实际上是该数组第一个元素指针

感到困惑?让我们来更好地理解这一点,并再次使用上面的“内存地址示例”。

第一个元素内存地址数组的名称相同

示例

int myNumbers[4] = {25, 50, 75, 100};

// 获取 myNumbers 数组的内存地址
printf("%p\n", myNumbers);

// 获取第一个数组元素的内存地址
printf("%p\n", &myNumbers[0]);

结果

0x7ffe70f9d8f0
0x7ffe70f9d8f0
自己动手试一试 »

这基本上意味着我们可以通过指针来操作数组!

怎么做?由于 myNumbers 是 myNumbers 中第一个元素的指针,您可以使用 * 运算符来访问它

示例

int myNumbers[4] = {25, 50, 75, 100};

// 获取 myNumbers 中第一个元素的值
printf("%d", *myNumbers);

结果

25
自己动手试一试 »

要访问 myNumbers 中的其余元素,您可以递增指针/数组(+1, +2, 等)

示例

int myNumbers[4] = {25, 50, 75, 100};

// 获取 myNumbers 中第二个元素的值
printf("%d\n", *(myNumbers + 1));

// 获取 myNumbers 中第三个元素的值
printf("%d", *(myNumbers + 2));

// 以此类推..

结果

50
75
自己动手试一试 »

或者遍历它

示例

int myNumbers[4] = {25, 50, 75, 100};
int *ptr = myNumbers;
int i;

for (i = 0; i < 4; i++) {
  printf("%d\n", *(ptr + i));
}

结果

25
50
75
100
自己动手试一试 »

也可以使用指针更改数组元素的值

示例

int myNumbers[4] = {25, 50, 75, 100};

// 将第一个元素的值更改为 13
*myNumbers = 13;

// 将第二个元素的值更改为 17
*(myNumbers +1) = 17;

// 获取第一个元素的值
printf("%d\n", *myNumbers);

// 获取第二个元素的值
printf("%d\n", *(myNumbers + 1));

结果

13
17
自己动手试一试 »

这种处理数组的方式可能看起来有点多余。特别是对于上面示例中简单的数组。但是,对于大型数组,使用指针来访问和操作数组会更有效率。

通过指针访问二维数组也被认为更快速和更容易。

由于字符串实际上是数组,您也可以使用指针来访问字符串

目前,您知道这是如何工作的就足够了。但正如我们在上一章中提到的;指针必须小心处理,因为有可能覆盖存储在内存中的其他数据。


×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持