问几个C语言的问题

小弟菜鸟 关于指针的地方有几处不懂
1 int *p=NULL 和 int *p=0 有些人说是一样的 我不明白啊 我绝对不一样 前者是让这个指针暂时指向内存的首地址(无有效数据) 后者是让内存指向一个0占有的内存(可能是0X...的内存单元) 应该不一样吧?
2 有些函数的参数前加& 表示引用 这个引用我实在看不明白 和指针的区别在哪里?
3 (int *p)[5]={...}是一个定义一个p指针 指向一个一维含5个元素的数组
我有点弄不明白 这个数组要有名字吧 比如int a[5]={...};int *p=a;这个我能理解 (int *p)[5]={...}我有点理解不了了 这个p指针指向这个数组的首地址 但是这个数组没有名字 同学说 这个数组就是p[5] 我还是不怎么懂

请高手教教我

1 int *p=NULL 和 int *p=0 有些人说是一样的 我不明白啊 我绝对不一样 前者是让这个指针暂时指向内存的首地址(无有效数据) 后者是让内存指向一个0占有的内存(可能是0X...的内存单元) 应该不一样吧?
答:一样的.一般头文件里会有宏定义
#define NULL 0
这样的话,你明白了吧.
每个程序头部0号这个单元都是空的,目的就是为了让空的指针指向这里,一旦引用了这个单元,程序就知道这个指针是空的.

2 有些函数的参数前加& 表示引用 这个引用我实在看不明白 和指针的区别在哪里?
答:看下面函数和说明:
fun1(int &a,int &b)//这里告诉编译器,这个函数是传址的,不是传值的,所以所引用的参数在函数退出后值会改变
{
int t;
t=a;
a=b;
b=t;
}
这种情况下:int aa=8,bb=9;fun1(aa,bb);运行结束后,aa=9,bb=8

fun2(int *a,int *b)//这里没有引用符号,所以是传值.先不要激动,说这明明是把地址传进去了,怎么会是传值呢.
听我慢慢说,如果不信,你可以跟着我做个实验

{
int *t;
t=a;
a=b;
b=t;
}
int aa[3]={1,2,3};int bb[3]={4,5,6};
printf("%ld %d",aa,bb);
fun2(aa,bb);
printf("%d %d",aa,bb);
//怎么样,是不是没有变?
是的,虽然指针传进函数,能对指针所指向的单元进行改动,但对指针本身却是改变不了的.

3 (int *p)[5]={...}是一个定义一个p指针 指向一个一维含5个元素的数组
我有点弄不明白 这个数组要有名字吧 比如int a[5]={...};int *p=a;这个我能理解 (int *p)[5]={...}我有点理解不了了 这个p指针指向这个数组的首地址 但是这个数组没有名字 同学说 这个数组就是p[5] 我还是不怎么懂

答:这是连续的五个指针变量.分别是p[0]到p[4],这里说一说p[0]你就应该可以知道其它四个的含义了.
我们再定义一个int *a.
此时,a和p[0]是同一个级别的指针,它们都应该指向一个sizeof(int)大小的内存空间.
这个数组有名字的,它的名字是p
p指向的是连续五个sizeof(int *)大小的内存空间.每个空间代表一个指针向量.每个向量又可指向别外的int型空间
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-04-29
我不是高手
第一个问题中int*p=NULL;int *p=0;在此处是等效的
应为NULL;是一个宏,它就是0,内存中NULL(首地址)
其实也是0,里面存放系统很重要的东西,不能使用,否则可能会系统崩溃。&这个表示应用时,它表示的是它是它接收的那个对象的引用,相当于它接收的对象的一个别名,像现实生活中的花名等。
p在这里是一个指针变量 ,它的作用相当于数组名,只不过这里是个地址,且可传入地址。

参考资料:我也是刚学程序,大家一起进步

第2个回答  2008-04-29
1:问个问题……内存的首地址和0X有什么不同么?
程序在载入的时候就被虚拟个地址结构了!~所以首地址和0X都可以表示程序开始的地址0X
2:*是取地址上的值,而&是取值的地址!~
3:这个……没见过这种形式,不晓得是那本书上写的……
()是强制转换类型或是优先!~
个人认为可能是双指针不知道你那书上有没有int **i;传说双指针没有不能访问的东西……
第3个回答  2008-04-29
1:NuLL代表没有赋值;0代表已经赋了直,已经赋0了!
2:+&就是代表这个东西取地址的意思,而不是取值;
3:定义一个整型的数组指向指针变量
第4个回答  2008-04-29
1 int *p=NULL 和 int *p=0 有些人说是一样的?
是的,在C里用宏定义#define NULL 0
所以它们是一样的。所以char *p=NULL的意思是p->0x00的内存地址单元。自然,在正常情况如果你给它的内容赋值。一定会段错误。因为操作系统会发现,那个地址不属于你的程序。

2 有些函数的参数前加& 表示引用 这个引用我实在看不明白 和指针的区别在哪里?

这里注意的是你说的是C里还是C++里。如果是C里。没有引用这种说法。C里没有引用。只有取地址。所以&也是取地址的意思。而且它只能出现在实参里,C++里的话是引用。就是函数的一个别名。其它和指针大同小意。只是你传过来的对象时如果用指针得用p->data 而用引用就可以p.data了。

这也是我讨厌C++的原因之一。

3 (int *p)[5]={...}是一个定义一个p指针 指向一个一维含5个元素的数组
这里你要弄明白,它是一个定义。是定义一个指针。和定义 char *p="hello world"是一个道理。
计算机里的变量实际上都是一个地址。
int a[5]是一个地址。他可能是0x8848ef。也就是说a的内容是0x8848ef.
同理 (int *p)[5]也是一个地址,p的内容也和a一样.
第5个回答  2008-04-29
1)在VC++的stdio.h文件中有如下定义:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可见,在C++(cplusplus)中 “NULL”和“0”是完全相同的
在C语言中,我不确定,但下面这段程序的输出结果是 “0”
int *p = NULL;
printf("%d",p);

2)“&”和指针的用起来是一样的,但有时候,一个变量没有定义指向它的指针,但是某处要用到它的指针,那就用“&”。例如
int a=0;
void f(int *x)
{
*x = 5;
}

f(&a);

3)用语言还是不要太怪癖的好,“(int *p)[5]={...}”这种用法对不对先不说,让人费解。在VC++的控制台程序中定义提示是有错误的。

至于一个指针指向数组的首地址,用这个指针代替数组名是没问题的。因为数组名本身就是指向数组首地址的指针。
相似回答