C语言指针新手求助:如何用指针与函数打印数组存储的实际值
解决C语言指针输出数组实际值的问题
嘿,我来帮你搞定这个指针的小问题!你现在输出的是内存地址,大概率是因为直接打印了指针变量本身,而没有去访问它指向的内存里的实际值。咱们一步步来解决:
问题根源
当你声明一个指向数组的指针(比如int *ptr = arr;),ptr本身存储的是数组第一个元素的内存地址。如果直接打印ptr或者ptr + i,得到的就是对应的地址;要拿到地址里的实际值,得用解引用操作符*。
错误示例(打印地址的情况)
先看看你可能写的类似代码:
#include <stdio.h> int main() { int arr[] = {10, 20, 30, 40}; int *ptr = arr; for (int i = 0; i < 4; i++) { printf("%p\n", ptr + i); // 这里打印的是内存地址 } return 0; }
正确实现(打印实际值)
只需要对指针做解引用操作,或者用更直观的数组下标语法(本质也是解引用的语法糖):
#include <stdio.h> int main() { int arr[] = {10, 20, 30, 40}; int *ptr = arr; // 自动计算数组长度,避免硬编码数字 int arr_length = sizeof(arr) / sizeof(arr[0]); for (int i = 0; i < arr_length; i++) { // 方法1:用解引用操作符*获取指针指向的值 printf("数组第%d个元素的值:%d\n", i + 1, *(ptr + i)); // 方法2:用数组下标语法,ptr[i] 和 *(ptr + i) 完全等价 // printf("数组第%d个元素的值:%d\n", i + 1, ptr[i]); } return 0; }
关键知识点解释
arr是数组名,它本身就等价于指向数组第一个元素的指针,所以int *ptr = arr;让ptr指向数组的首元素。ptr + i会根据指针的类型(这里是int*)自动移动i * sizeof(int)个字节,指向数组的第i个元素。*(ptr + i)就是对这个地址做解引用,取出地址里存储的实际数值。ptr[i]是C语言提供的语法糖,和*(ptr + i)完全一样,写起来更直观,适合刚学指针的朋友。
小提示
打印不同类型的数据要对应正确的格式符:
- 打印内存地址用
%p - 打印整数用
%d(如果是long类型用%ld,依此类推)
内容的提问来源于stack exchange,提问作者user9373985
相关产品推荐
相关产品推荐

