C 语言 数组与指针

发布于 2024-05-03 06:31:23 字数 2111 浏览 18 评论 0

当创建一个数组后,数组变量就可以当做指针使用,它指向数组在存储器中的首地址。

printf("%p", quote);

2.1 字符串函数传递

函数中传递字符串,就是传入了一个指向字符串的指针。也就是说如果把函数参数声明为数组,它会被当做指针处理

这里 sizeof 是一个运算符而不是函数, 不要搞错了~

在 32 位操作系统中,存储器地址以 32 位数字的形式保存,所以叫 32 位操作系统,32 位=4 字节(byte)(4*8bit), 所以 64 位操作系统要 8 个字节来保存地址。

2.2 数组变量与指针不同点

虽然数组变量可用作指针但两者又有区别

char s[] = "How big is it?";
char *t = s;

(1). sizeof 取得大小不同

(2). 数组的地址还是数组地址,指针变量地址则不是

  • 指针变量:保存存储在存储器地址的变量
  • 数组变量:使用 & 运算符取得的还是数组变量本身
    &s == s;
    &t != t;

(3). 数组变量不能指向其他地方

当创建指针变量时,计算机会为它分配 4 或 8 字节的存储空间。但如果创建的是数组呢?计算机会为数组分配存储空间,但不会为数组变量分配任何空间,编译器仅在出现它的地方把它替换成数组的起始地址。

由于计算机没有为数组变量分配空间,也就不能把它指向其他地方

s = t; // 报错

2.3 指针退化

2.4 数组与指针的交互

  • 数组变量可看做指针, * 运算符取数组首地址,所以以下语句成立:
    msg[0] == *msg
  • 内存地址是一串 16 进制的数字表示,可以进行算术运行,如果找数组中下一个元素可以通过加地址(也就是增加指针的值) 既可以用方括
    号加上索引值 2 来读取元素,也可以对第一个元素的地址加 2:
    msg[2] == *(msg + 2)

如下代码:从第 6 个字符开始打印

void skip(char *msg) {
    // msg 指针+6,将从第 7 个字符开始打印
    puts(msg+6);    // call me
}
int main() {
    char *msg = "Don't call me";
    skip(msg);
    return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

凉墨

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

内心激荡

文章 0 评论 0

JSmiles

文章 0 评论 0

左秋

文章 0 评论 0

迪街小绵羊

文章 0 评论 0

瞳孔里扚悲伤

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文