C 语言 数组与指针
当创建一个数组后,数组变量就可以当做指针使用,它指向数组在存储器中的首地址。
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 技术交流群。
上一篇: C 语言中的指针是啥玩意?
下一篇: 彻底找到 Tomcat 启动速度慢的元凶
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论