指针与数组的区别
来源:互联网 发布:给妈妈买衣服的淘宝店 编辑:程序博客网 时间:2024/05/17 08:09
指针和数组的一个不同,是在空间上分配的不同,下面测试程序分别定义了全局指针变量,全局数组变量,局部指针变量,局部数组变量:
引用#include <stdio.h>
char *p = "hello";
char b[] = "LINUX-WORLD";
int main()
{
char *p1 = "world";
char a[] = "linux-wrold";
printf ("%s/n", p);
printf ("%s/n", p1);
return 0;
}
编译生成可执行文件后,用 objdump 看一下,这些用来初始化指针和数组的字符串都放在哪里:
引用Contents of section .rodata:
8048528 03000000 01000200 68656c6c 6f00776f ........hello.wo
8048538 726c6400 rld.
可见,不管是全局指针变量,还是局部指针变量,都会放在 .rodata section 里。.rodata 是只读的常量段,所以放在这里的字符串是无法更改的,也就是说,试图更改这些字符串会发生错误。
对于全局数组 b:
引用Contents of section .data:
804a00c 00000000 00000000 30850408 4c494e55 ........0...LINU
804a01c 582d574f 524c4400 X-WORLD.
可见,初始化内容放在 .data section 里。.data 段是数据段,它用来存放初始化了的全局变量,初始化了的静态变量,这里的内容可读可写。
对于局部数组 a :
引用Contents of section .text:
... ...
8048420 e55183ec 14c745f8 36850408 c745ec6c .Q....E.6....E.l
8048430 696e75c7 45f0782d 7772c745 f46f6c64 inu.E.x-wr.E.old
... ...
局部数组 a ,放在代码段,代码断用来存放程序代码。这里的数据一经编译好,就会确定下来。
相关段含义:http://www.groad.net/bbs/read.php?tid-1161.html
不能直接用 &a 的方式赋值到一个指针的指针中去,如:
引用char **q = &a;
因为,数组名本身就是一个“明确”的地址,而不是一个变量,一个变量通过 & 符号可以取得自己的地址,但一个明确的地址,再用 & 时,就不知道取何值。
但是可以间接的通过一个指针来过渡:
引用#include <stdio.h>
int main()
{
char a[] = "linux-world";
char *p = a;
char **q = &p;
printf ("%c/n", **q);
printf ("%s/n", *q);
return 0;
}
运行及输出:
引用beyes@linux-beyes:~/C/exam> ./point_and_array.exe
l
linux-world
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 指针数组与数组指针的区别
- 指针数组与数组指针的区别
- 指针数组与数组指针的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 指针数组与数组指针的区别
- 数组指针与指针数组的区别
- 数组指针与指针数组的区别
- 指针数组与数组指针的区别
- 指针数组与数组指针的区别
- 指针数组与数组指针的区别
- 来到这里很高兴
- 多线程编程之二——MFC中的多线程开发
- 从零开始Desire HD刷机指南 —— 第一章:开篇
- extjs表单验证
- 多线程编程之三——线程间通讯
- 指针与数组的区别
- 学习笔记----------------------分页
- openssl 代码分析(3) 深入d2i_x509
- C代码优化方案
- 多线程编程之四——线程的同步
- 当初的愿望实现了吗
- JS OO继承、多继承一法
- 从零开始Desire HD刷机指南 —— 第二章:基本概念
- 给sqlplus安装更齐全的help