关于c语言指针,希望老师详细解说下

自己举个小例子,#include<stdio.h>intmain(){intx=10;int*a;a=&x;printf("a=%d\n",a);inty=10;int*... 自己举个小例子,
#include<stdio.h>
int main()
{
int x=10;
int *a;
a=&x;
printf("a=%d\n",a);
int y=10;
int *b;
b=&x;
printf("b=%d\n",*b);
return 0;
}
运行结果是 a=1245052,b=10。
陈述下我要表达的问题。刚刚学到这一节指针,指针可以2种赋值,取地址赋值&,以及直接地址赋值。
上面的 int x=10;int *a;a=&x;这一段应该就是取地址赋值,那么直接地址赋值是怎么样的呢?我试过
int x=10;int*a;a=x;这样是错误的。
还有,为什么a=1245052,printf输出的a难道不是指针变量指向的变量地址a吗?那么这个值是怎么来的?我并没有定义a的值啊
而第二个printf输出的是*b,是这样的输出才是正确的吗?
小白刚刚学c,求老师指点下
展开
 我来答
hzhspace
2014-06-20 · TA获得超过233个赞
知道小有建树答主
回答量:105
采纳率:0%
帮助的人:96.2万
展开全部
(1)赋值表达式,等号二边的类型必须赋值兼容。比如int x=10;int*a;a=x,a的类型是int*,而x的类型是int,所以a=x是不能赋值的。
(2)至于a=1245052,那是因为a变量中存放的是x变量的地址,也就是1245052就是x的地址。所以printf("a=%d\n",a);输出的是a的值,也就是x的地址。
(3)*b的含义就是找出b变量值所对应的存储单元的内容。看看程序中的语句:
int y=10;
int *b;
b=&x;
b中存放的是x变量的地址,那就把该地址对应的存储单元中内容取出来,该存储单元存放的是x变量的值,所以*b取出的也就是x变量的值。
(4)在实存系统下,可以将你已知的地址直接给指针变量赋值,由你来确保该地址对应的存储单元是可用的。比如
int*p=(int*)0xef8811AD;
在虚存系统下,上面的代码是错误的。
qscorpius_fly
推荐于2016-12-04 · TA获得超过1858个赞
知道小有建树答主
回答量:811
采纳率:80%
帮助的人:305万
展开全部
直接地址赋值:
int x=10;
int *a=(int *)malloc(sizeof(int));//系统从内存中分配一个int大小的内存,将起始地址强制转换成int *型赋给指针变量a
int x=10;int*a;a=x;这是将变量x的值赋给a,而a是指针变量,它只能用地址赋值,因此将变量的值赋给指针变量是错误的
还有,为什么a=1245052,printf输出的a难道不是指针变量指向的变量地址a吗?那么这个值是怎么来的?我并没有定义a的值啊
答:printf输出的是a的值,由于a=&x,指针变量a的值就是变量x的地址,所以输出的这个值就是变量x所在内存单元的地址
而第二个printf输出的是*b,是这样的输出才是正确的吗?
答:这里输出的就是指针变量b所指向单元的内容,由于b=&x,即b指向变量x,所以(*b)实际上就是变量x的值,输出的就是变量x的值
追问
这位老师说的简单易懂,第一个我整明白了,实际上int *a,x=10;的那个a=&x的时候,printf输出的a,而原来定义*a的时候,a有地址,由于值由于没有赋值,我在这里称为不确定的值的,而printf输出*a的时候,*a是承接了x的地址,输出的是x的值,而不是a的值。
这位老师可以给我举一段简单的“直接地址赋值”吗,因为书上没有怎么讲
追答
指针变量必须指向有效的内存单元,即指针变量的值必须是有效内存单元的地址,否则就是“野指针”,野指针是不能使用的。因此指针变量使用前必须对其进行初始化,一种可以直接用变量的地址对其进行初始化,这种初始化的方法使得该指针变量就指向了某个变量;另一种方法是直接地址赋值,直接赋给指针变量一个有效单元的地址,如果直接int *a=100,但是100可能不是有效地址,因此是不允许直接给它赋一个地址值,如何确保分配一个有效地址呢?那么可以调用malloc函数交由系统动态分配一段有效的内存,并将这段内存的起始地址转换成可以与指针变量类型相符的指针赋给指针变量,比如a,那么a就指向这段内存的起始单元,malloc的用法如下;
(指针变量的类型)malloc(分配的单元字节数)
比如int *a;那么为a分配地址就应该写作a=(int *)malloc(sizeof(int)),(int *)强制转换成a的类型int *,sizeof(int)是一个int型数据所需占用的内存单元字节数
如果a准备用来指向一个10个单元的数组,那么为a分配地址就应该写作
a=(int *)malloc(10*sizeof(int)),分配10个整型单元所需的内存,并将这段内存的起始地址赋给a
malloc()函数所需的头文件是stdlib.h
使用malloc()函数分配的内存若不需要使用的时候应该用free()将其释放
malloc()使用的场合:
(1)为指针变量分配有效内存,尤其是指针变量并不确定指向某个变量的时候
(2)当所需的内存空间是变化的,比如说要对一组数据进行排序,而数据的个数并不确定,要在程序运行时由用户指定,这时候这组数据就不能用数组存储,可以用malloc()来分配内存,通过指针变量对每个单元进行访问
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
星韵柒痕
2014-06-20 · TA获得超过963个赞
知道小有建树答主
回答量:255
采纳率:0%
帮助的人:259万
展开全部

#include<stdio.h>
int main()
{
int x=10;
int *a;
a=&x;
*a=9;
printf("%d",x);
return 0;
}

用a给x的10赋值成9,应该很好理解

2 a输出地址的时候要用%p  专用的16进制地址输出格式

3 b输出没问题,后面和数组一起学的时候会学到更多输出方法

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dmjcq
2014-06-20 · TA获得超过312个赞
知道小有建树答主
回答量:317
采纳率:0%
帮助的人:190万
展开全部
  1. 直接地址赋值的形式: *((volatile unsigned long *)0x123456),类似这样,其中0x123456为你要赋值的地址,这种形式嵌入式用的比较多

  2. 首先 int x=10,int *a;

    系统将分配内存地址给x,a; 比如分到 x 地址为0x111, a 地址为0x222

    a = &x; 意味着将x的地址(0x111) 放到 0x222中.

    printf(a) 意味打印a的地址,即0x222

    printf(*a) 意味打印a 地址保存的地址的值.即 0x222 -> 0x111 -> 10

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
戏如人生188
2014-06-20 · TA获得超过446个赞
知道小有建树答主
回答量:334
采纳率:0%
帮助的人:178万
展开全部
首先,关于你的第一个问题直接地址赋值的写法是是int x=10;int *a=x;
而你直接输出a的话,其实输出的是x的地址,并不是x的值,对于指针的话要加个*之后,才会取到该地址所存储的值
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式