您的位置:首页 > 其它

“指针变量不用分配空间也可以存储数据”

2012-02-29 18:08 1221 查看
今天下午 我们进行了c语言考试,考完后,我的脑中浮现出来:指针也是变量,那么该指针变量一定也是有地址的,于是我就动手验证了一下指针变量的地址。

首先我要先说明一下, 我们在用指针变量一定不要忘记分配空间,用完后不要忘记释放空间;之所以把这篇文章这么命题,是因为我在验证 存储指针变量的地址 的过程中对变量有了一点自己的认识。

以下 是我 为了 验证“存储指针变量的地址” 自己动手 敲打 的代码, 希望 对大家 能有点帮助:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
const char* str_example = "I am in heap";
char *p_no;				// 未初始化的指针变量
char *p_null_str = NULL;			  // 初始化为 NULL 的指针变量
char *p_const_str = "Hello World";	  // 初始化为字符常量的指针变量
char *p_heap_str = new char[strlen(str_example) + 1];  // 在堆中 分配存储空间 的指针变量
strcpy(p_heap_str, str_example);			           // 将 常量字符串 复制到 堆中

int a = 5;		// a 变量 为了 对比 存储 “指针变量”(理解为一个普通变量) 的地址 的位置而设置的。
printf("a 的地址是%p\n", &a);/* 结果 表明 存储 “指针变量” 的地址 的位置 在栈空间上。
因此 才有 可以改变 存储“指针变量” 地址 的栈空间 为具体 的数据*/

printf("p_no \t\t指针变量的 地址是 地址是:%p\n", &p_no);
printf("p_null_str \t指针变量的 地址是 地址是:%p\n", &p_null_str);
printf("p_const_str \t指针变量的 地址是:%p\n", &p_const_str);

printf("p_heap_str \t指针变量的 地址是:%p\n", &p_heap_str);
printf("p_heap_str \t指针变量 存储的“地址值”是:%p\n", p_heap_str);

*((char*)(&p_no)) = 'a';  // 将 存储 p_no 指针变量的 地址 强制转换成 字符指针类型,然后将该地址上的数据 改成 字符‘a’
*((char*)(&p_null_str)) = 'b';
*((char*)(&p_const_str)) = 'c';
/*   *((char*)(&p_heap_str)) = 'd';
如果 添上了 这条语句,就是 将 存放“p_heap_str地址”的 内存地址(仅第一个字节) 改变成了 ‘a’的值
而且 在 后面 释放 这块 空间时, 系统因为找不到“p_heap_str的地址”而找不到p_heap_str所指向的地址(即该指针所存的值)而报错*/

// 经过以上改变后 就可以看做是 普通的 字符型变量 输出
printf("p_no 的地址存得是 %c\n", p_no);
printf("p_null_str 的地址存得是 %c\n", p_null_str);
printf("p_const_str 的地址存得是 %c\n", p_const_str);

printf("p_heap_str 的地址存得是 %s\n", p_heap_str);

// 释放
delete[] p_heap_str;
p_heap_str = NULL;

return 0;
}


运行 结果 如下:



总结:

1. 在我们平时指针变量时一定不要忘记为它分配空间,最后别忘记释放空间。

2.以上的代码主要 表达的是: 指针变量 也需要 有地址记录的,而且该存储指针变量的地址是在空间上, 在以上的程序中我也是 改变了 存储 “指针变量”的地址 中的值 而实现的存储新的值。

3.可以将代码中的 *((char*)(&指针变量的名称)) 整体 理解为 一个 普通 的 字符型的变量my_char,这样 这句*((char*)(&p_no)) = 'a' 就可以简单的理解为: my_char = 'a';

4. 经过将近 一个半小时的 在vc6.0上验证后,我对指针的概念加深了一点,感觉这段时间 过得 很充实 。

5. 这是我 第一次 在 CSDN上 发表技术类文章, 而且我的 技术水平很菜,难免有些错误 和 疏漏之处, 希望各位CSDN上的前辈们 可以 积极的 指证我的过错,我一定会虚心接受,认真改正。

6. 最后 希望 各位 CSDN 上和我一样 刚刚 踏入 计算机领域的 同胞们 早日 学有所成, 为自己 带来 丰富多彩的好生活, 谢谢大家。

原创作者:Renzhibo 时间:2012年2月29日18:11:27
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐