*/ ————————————————————————————–
*/ 出自: 编程中国 http://www.bc-cn.net
*/ 作者: hackerjiang E-mail:hackerjiang@qq.com QQ:298218699
*/ 时间: 2007-8-6 编程论坛首发
*/ 声明: 尊重作者劳动,转载请保留本段文字
*/ ————————————————————————————–
看了前面仁兄写的“指针其实就这么简单”,我的手就痒痒了,呵呵。我也来现丑!
首先,因为是“三言两语”,所以那些“指针是C语言的灵魂”的废话我就不多说了,呵呵。
前言:如果想简单一点,只看彩色即可,黑色一般是扩充,感兴趣的朋友可以看一看。
入正题:
指针是什么?——指针是一种数据类型
形象的说,大家都知道“邮箱”与“邮箱里的信件”的关系吧!其实就是“地址”(指针)与“地址的内容”(指针指向的内容)的关系!
如图:(耐烦的看,不耐烦的跳过)
(自己画的,有点粗糙,别怪我。)
图中描述了6个内存单元,它们的编号分别是从1000到1005的6个值,其中编号1000到1005就是相应的内存单元的地址。
数据存放在地址所标识的内存单元中。地址1000到1005多对应的内存单元就是用来存放数据的。
继续:把内存单元想像成一个个“邮箱”,而内存单元的数据就好比是“邮箱中的信件”,内存单元的编号(地址)就好比是“邮箱的编号”。
(插一小段,耐烦的看,不耐烦的跳过:如果在程序中定义一个变量,那么编译是系统就会为变量分配一定数量的内存单元。一般系统会为字符型的变量分配1个字节的储存空间,为整型变量分配2个字节的储存空间,浮点型的4个字节)
总结:1`地址起到一个指向作用。2`地址中还隐含有这个变量的类型信息。
其实,“指针”就是“地址”。通过“指针”可以找到以它为地址的内存单元。一个变量的地址称为该变量的指针。
超级大推理:
——中心:一个变量的地址(指针)也是一个值。
→专门用来存放变量地址的变量,称为“指针变量”。
→所以“指针变量”的值是“指针”(一个变量的地址)。
指针的运算:指针就地址。C语言中的地址是无符整数。
对于指针变量,允许的主要运算有:1`指针变量的赋值。2`指针与整数之间的加减运算。3`指针之间的比较。4`指针之间的加减运算。
呵呵“`不知写得好不好。如果大家支持,我将写续集,下一集应该是写“指针与一维数组”吧。呵呵“`
附:回帖是一种美德。向回帖的同志致敬!
=================================================================================
精彩回复 作者:福尔摩斯
形象的说,大家都知道“邮箱”与“邮箱里的信件”的关系吧!其实就是“地址”(指针)与“地址的内容”(指针指向的内容)的关系!
指针的概念更像一个邮递员!
至于老K说的:指针不是地址,指什变量的值是一个地址.
解释下:
大家还记得高中数学中一个概念吗:向量(物理称 矢量)
向量有双要素:方向 和 模长
同样,指针 是 向量 的计算机化(就像是 数组 是 数列 的计算机化一样)
当定义一个 指针变量 的时候,计算机分配给它空间,用这个空间来存放地址
我们把一个值赋给一个变量,那么这个空间存放的值就是这个变量的值
同样道理,我们把一个地址(无符号整型)赋给一个指针变量,那么这个空间存放的地址就是这个指针变量的值
而这个概念就是 方向 !
而模长的概念就是 *p !
也许还有人听不明白,我用C语言程序来说明:
我们常常利用 指针 来改变被传递到自定义函数的值(实参),让 改变的值 返回主函数!
而这个 改变的值 是指针所指向的 地址上 的 改变的值 (红色部分代码)
而 不是 改变了 指针的指向 (蓝色部分代码)!
#include<stdio.h>
int main()
{
int *p,*q,a=1,b=2;
int change(int *,int *);
p=&a;q=&b;
change(p,q);
printf(“%d,%d\n”,*p,*q);
getch();
return 0;
}
int change(int *x,int *y)
{
int *z;
z=x;x=y;y=z;//这里改变了指针的地址,但是结果却没有改变,因为指针的值是地址,是不会被传递回主函数的
}
PS:
int change(int *x,int *y)
{
int z;
z=*x;*x=*y;*y=z;//它改变了指针所指向的值,但是没有改变指针的地址!
}
注意蓝色部分如果把 *z 改成 z (或者红色部分 z 改成 *z )都是不可以的!
因为int *z;那么z的空间就是用来存放地址,虽然你也可以认为这样可以传递,但是如果是聪明的编译器就会警告,不聪明的编译器就会报错
所以还是请大家规范书写!
>> 本文固定链接: http://www.vcgood.com/archives/1795
请问 大侠:
/*
* Private wrapper structure for allocated memory
*/
typedef struct {
int size;
int rw;
void *data;
} memblock;
/*
* Accessor macros
*/
#define TYPE_OF(v) ((v)->type)
#define BOOL_OF(v) ((v)->value_u.bool_val)
#define INT_OF(v) ((v)->value_u.int_val)
#define FLOAT_OF(v) ((v)->value_u.float_val)
#define STRLEN_OF(v) ((v)->value_u.string_val.len)
#define STR_OF(v) ((v)->value_u.string_val.value)
#define ARRLEN_OF(v) ((v)->value_u.array_val.len)
#define ARR_OF(v) ((v)->value_u.array_val.value)
#define RESTYPE_OF(v) ((v)->value_u.res_val->type)
#define RESDATA_OF(v) ((v)->value_u.res_val->data)
/*
* Copy bytes from memory resource to memory resource
*
* This routine will corrupt memory if source and destination
* memory resources overlap.
*/
value *mem_cpy(arena_state *s, unsigned int argc, value **argv)
{
memblock *dst = RESDATA_OF(argv[0]);
int dst_off = INT_OF(argv[1]);
memblock *src = RESDATA_OF(argv[2]);
int src_off = INT_OF(argv[3]);
int count = INT_OF(argv[4]);
if (!is_mem(argv[0]) || !dst || !is_mem(argv[2]) || !src) {
return value_make_bool(0);
}
if (count == 0) {
return value_make_bool(1);
}
if (count > src->size – src_off) {
count = src->size – src_off;
}
if (dst_off + count > dst->size) {
dst->data = oom(realloc(dst->data, dst_off + count));
dst->size = dst_off + count;
}
memcpy(dst->data + dst_off, src->data + src_off, count);
//编译时提示: error C2036: ‘void *’ : unknown size
return value_make_bool(1);
}
请问这是怎么回事?
给了我一些指示啊
长见识
这语言组织能力也太差了吧,还不如老老实实的讲呢~~~
好像没怎么深入的讲解啊,尤其是指针和数组的关系??
顶了,楼主啥时再续啊!
支持了,不错!
我也顶一下~~!
楼主说得不是很清楚,我的理解:
int *p;/*定义一个指针变量*/
p *p
存放地址 存放值
指针变量 变量的地址
书本的索引 具体内容/*打个比方表示p与*p的关系*/