关于C语言中取地址符号的疑问???

ILVCNET 2008-09-16 02:47:56
#include <stdio.h>
#include <malloc.h>
#include <conio.h>

#define ERROR 0;
#define OK 1;
const unsigned int STACK_INIT_SIZE=100;//为什么用这个:#define STACK_INIT_SIZE 100;不行??
const unsigned int STACKINCREMENT=10;//与上面的问题一样??

typedef struct
{
int *base;
int *top;
int stacksize;
}SqStack;

int InitStack(SqStack &s)
{
s.base=(int *)malloc(STACK_INIT_SIZE * sizeof(SqStack));
if(!s.base)
return ERROR;
s.top=s.base;
s.stacksize=STACK_INIT_SIZE;
return OK;
}

int Push(SqStack &s,int e)
{
if(s.top-s.base>=s.stacksize)
{
s.base=(int *)realloc(s.base,(STACK_INIT_SIZE+STACKINCREMENT) * sizeof(SqStack));
if(!s.base)
return ERROR;
s.top=s.base+STACK_INIT_SIZE;
s.stacksize+=STACKINCREMENT;
}
*s.top=e;
s.top++;
return OK;
}

int Pop(SqStack &s,int &e)//这里为什么用&e ,而用e不行?
{
if(s.top==s.base)
return ERROR;
s.top--;
e=*s.top;
return OK;
}

int StackEmpty(SqStack s)
{
if(s.top==s.base)
return OK;
return ERROR;
}

void Convertion()
{
int N;
SqStack MyStack;
InitStack(MyStack);
printf("输入您要转换的数:");
scanf("%d",&N);
while(N)
{
Push(MyStack,N%2);
N=N/2;
}
printf("转换后的输出如下:");
while(!StackEmpty(MyStack))
{
int temp;
Pop(MyStack,temp);
printf("%d",temp);
}
printf("\n");
}

void main()
{
Convertion();
}
...全文
1218 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ILVCNET 2008-11-27
  • 打赏
  • 举报
回复
谢谢各位,结贴去了!!!
windriverer 2008-09-18
  • 打赏
  • 举报
回复

int e是把一个常数传给函数(在函数中直接是常量而没有值)
而int &e是把这个常数所在的地址传给函数(在函数中通过地址来得到这个函数的值)

所以后者可以在函数中被修改 前者不能修改




为什么不能修改,是因为函数的输入参数传递通常是通过寄存器来实现的,所以传过去的常量值你是找不到原来的地址的



太乙 2008-09-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 ILVCNET 的回复:]
再谢各位了,我还想问一下:int &e 是什么意思?我知道:在 int *e 中,int是基类型,* 表示指向,e 是指针变量;e=&a这里的&是取地址运算符,那么int &e中的&还是表示取地址运算符吗?如果不是,那么int、&、e分别表示意思呢?
[/Quote]

int &e 定义一个int的引用




//可以这么写
#include <iostream>

using namespace std;

void main()
{
int b=2;
int & e =b;
e=3;
cout<<b;//3
cout<<e;//3
}





windriverer 2008-09-18
  • 打赏
  • 举报
回复
要弄懂指针和地址 最好能开着调试器对着编译后的汇编码看


ILVCNET 2008-09-18
  • 打赏
  • 举报
回复
再谢各位了,我还想问一下:int &e 是什么意思?我知道:在 int *e 中,int是基类型,* 表示指向,e 是指针变量;e=&a这里的&是取地址运算符,那么int &e中的&还是表示取地址运算符吗?如果不是,那么int、&、e分别表示意思呢?
devil_zuiai 2008-09-16
  • 打赏
  • 举报
回复
举个经典的引用的例子吧:
swap()进行两个数的值交换的函数
void swap1(int a, int b)
{
int c = a;
a = b;
b = c;
}

void swap2(int &a, int &b)
{
int c = a;
a = b;
b = c;
}


void main()
{
int a = 3;
int b = 4;
swap1(a, b);
printf("%d, %d\n", a, b); // 3, 4 不是引用传递a,b的值没有交换
swap2(a, b);
printf("%d, %d\n", a, b); // 4, 3 用引用传递a,b的值交换了
}
潇湘秦 2008-09-16
  • 打赏
  • 举报
回复
感觉用指针会好点
ILVCNET 2008-09-16
  • 打赏
  • 举报
回复
果然有好多高手,教授推荐的网站还真是不错,回复速度挺快,谢谢各位了,我要解释一下,上面的程序不是纯C编写的,哎,我们学校发的书是C/C++程序设计,开发环境是VC++ 6.0,看来我得去买本专门讲C的书了,呵呵!
catamout 2008-09-16
  • 打赏
  • 举报
回复
二楼 回答的很详细了 看二楼应该可以懂了
ForestDB 2008-09-16
  • 打赏
  • 举报
回复
用#define要记得它只是文本替换,所以这时如果有`;`会有什么结果?
至于`&`估计得多理解下地址。
mifeixq 2008-09-16
  • 打赏
  • 举报
回复
lz上面用到的&是C++中引用的概念
mifeixq 2008-09-16
  • 打赏
  • 举报
回复
楼上两人回答的够详细了……
_石头_ 2008-09-16
  • 打赏
  • 举报
回复
lz的问题ls都回答了!
补充一下:
#define ERROR 0; //这两个宏定义后面的' ; '要去掉
#define OK 1;

另外c不支持引用(c++才支持)。
int Pop(SqStack *s,int *e) //这里可以改为指针(函数里面作相应改动),只支持c的编译器里不支持引用!
Pop(&MyStack,&temp);//调用的时候用取址符取出实产的地址,赋给形参指针
lann64 2008-09-16
  • 打赏
  • 举报
回复
const unsigned int STACK_INIT_SIZE=100;//为什么用这个:#define STACK_INIT_SIZE 100;不行??
const unsigned int STACKINCREMENT=10;//与上面的问题一样??
-------------------------
最好使用常量声明,#define定义的变量被预处理程序替换了,编译器看不到这个变量,会导致程序中存在多份常量拷贝,且难以调试。



int Pop(SqStack &s,int &e)//这里为什么用&e ,而用e不行?
------------------------------
由于是值传递,只有引用可以把值带回来,直接用e,操作的就是个副本了。

另外,楼主的程序是C++还是C呀?好像是c++语法写的c程序。
ILVCNET 2008-09-16
  • 打赏
  • 举报
回复
小弟是新手,正学着C和数据结构,现在被指针、地址之类的东西搞晕死掉了,希望各位能帮忙解答解答!!!小弟在此先谢过了!

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧