指针,数组,我又糊涂了

mozei 2011-10-21 12:15:00
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &b;
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}


输出结果:
a = -1787663456 , c = (nil)

a 难道不应该等于c 吗?


...全文
444 31 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
AndyZhang 2011-10-25
  • 打赏
  • 举报
回复
a = b;
human8848 2011-10-25
  • 打赏
  • 举报
回复
一个打印数组的地址,一个打印数组元素的值,如是而已
叶子的翅膀 2011-10-25
  • 打赏
  • 举报
回复
a是int*型的,c是int型的。a是一个指向int类型的指针,c是一个整形变量。两者不存在可比性。
梦境传说 2011-10-25
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &b; //这句话不对,b本身就是地址,不需要加&。 这样写编译肯定通不过。
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}

如果想输出a 和 c 的值相等,下面的能正确输出:

#include "stdafx.h"
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{

int *a = 0;
int b[2]={0};
int c = 0;
a = b;
c = *a;
printf("a = %d,c = %d",*a,c);

system("pause");
return 0;
}
hawkoffree 2011-10-25
  • 打赏
  • 举报
回复
数组名b本身就代表一个指针,所以如果你想获取指针b的地址,那么就应该定义a为;指针的指针,即:int **a
fcjxxl 2011-10-25
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]
引用楼主 mozei 的回复:
C/C++ code
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &amp;b;
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}


输出结果:
a = -178766……
[/Quote]
就是这样,喵~
TMAC10052120353 2011-10-25
  • 打赏
  • 举报
回复
int *a=0;我猜你原来的意思是想让a指向的内容是0吧,你这样写法是错误的,因为你还没分配内存空间,你这样只能写成int *a = NULL;
无限生机 2011-10-23
  • 打赏
  • 举报
回复
乱的一塌糊涂!
pathuang68 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 mozei 的回复:]
C/C++ code
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &b;
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}


输出结果:
a = -1787663456 ,……
[/Quote]

1. a是int*,也就是一个指向int数据的指针,c是一个int,它们的数据类型都是不一样的。
2. c = *a; 说明c等于指针a所指向的内容,而不是c等于a。
3. &b是数组b的地址,严格地说a = &b;这样写是不正确的,至少要这么写:a = (int*)&b;
要注意&b和b以及&b[0]的值都是一样的,但含义大大的不同。b和&b[0]均表示数组中第一个元素的地址,
而&b表示的是整个数组的地址。
zhOu 2011-10-21
  • 打赏
  • 举报
回复
最后一句应该是 *a 表示取a地址存放的数据
zhOu 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 mozei 的回复:]
C/C++ code
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &b;
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}


输出结果:
a = -1787663456 ,……
[/Quote]

首先 a是指针 所以应该存放地址
所以应该是a=b 因为数组名也就是b本身就是一个地址
其次printf输出的时候 printf("a = %d,c = %d",*a,c);
a前面要加*表示 取a地址的值
JieTouLangRen 2011-10-21
  • 打赏
  • 举报
回复

a = &b;
LZ确定这句能通过编译吗??
ydacc 2011-10-21
  • 打赏
  • 举报
回复
就算对的话 a应该是b的地址 c是b[0]里面的数据
ydacc 2011-10-21
  • 打赏
  • 举报
回复
a = &b b本来就是地址吧 为什么要加& ????
ddownload 2011-10-21
  • 打赏
  • 举报
回复
a = -1787663456 这个是亮点
赵4老师 2011-10-21
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
xinshirn 2011-10-21
  • 打赏
  • 举报
回复
6楼很正确。

只想说一下
int *a;
int b[2]={};

a=b;
printf("%p\n",a);

a=&b;
printf("%p\n",a); //可写这么写的,虽然有点怪,但是一般来说编译器会报警

a=&b[0];
printf("%p\n",a);

上面三个结果都是一样的,第二种写法是没错,但是要报警的
fmworld 2011-10-21
  • 打赏
  • 举报
回复
b表示数组的地址,&b表示存放数组地址的这个变量的地址,a的值就是这个值,也就是指针的指针。而c应该又指向了数组的地址,即b.可是你的输出(nil) 是什么啊?
编程点滴 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]
引用楼主 mozei 的回复:
C/C++ code
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &amp;b;
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}


输出结果:
a = -178766……
[/Quote]
说得好啊!
快雪时晴 2011-10-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]
引用楼主 mozei 的回复:
C/C++ code
#include <stdio.h>

int main()
{
int* a = 0;
int b[2]={0};
int c = 0;
a = &amp;b;
c = *a;
printf("a = %d,c = %d",a,c);

return 0;
}


输出结果:
a = -178766……
[/Quote]

学习了
加载更多回复(11)

70,023

社区成员

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

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