5个回答
展开全部
C语言规范没有要求,有的编译器实现会给个警告,有的直接编译过。
定义指针后可以不初始化,但实际上这个指针变量中已经有一个值了(就是分给这个指针变量的地方内存中原来的值,假设是0x1234)。
但是用前一定要初始化,否则就是用去操作0x1234这个地方的内容,就会出问题,因为你并不知道把0x1234作为地址,所指向的地方是什么东西,可能是段系统代码,那么你的code就会搞挂系统。有时候对这个地方操作也可以工作(大部分情况都是的),但放到其他系统上去跑就会出问题,或者不小心写了个边界情况(可能是无意的),这样的话也会出问题
定义指针后可以不初始化,但实际上这个指针变量中已经有一个值了(就是分给这个指针变量的地方内存中原来的值,假设是0x1234)。
但是用前一定要初始化,否则就是用去操作0x1234这个地方的内容,就会出问题,因为你并不知道把0x1234作为地址,所指向的地方是什么东西,可能是段系统代码,那么你的code就会搞挂系统。有时候对这个地方操作也可以工作(大部分情况都是的),但放到其他系统上去跑就会出问题,或者不小心写了个边界情况(可能是无意的),这样的话也会出问题
2011-09-17
展开全部
定义一个指针可以不用初始化,但是在使用指针时一定要确定它是否被初始化即是否指向了某一个确定的可访问的内存位置。
如:int* p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。
int a;
p=&a;//将p指向变量a,此时p的指向是确定的
当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位置,所以上面的操作是正确的。
如:int* p;//定义一个整型指针此时可以不初始化,但它的指向是不确定的可能指向了系统中某一重要的内存位置。
int a;
p=&a;//将p指向变量a,此时p的指向是确定的
当对p进行解引用时如*p=20此时就要看看p的指向是否已确定。由于上面我们将p指向了a变量所在内存位置,所以上面的操作是正确的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
您在题目中的下面的文字是树上的吧?
指针的赋值,“=”的左操作数可以是*p,也可以是p。
当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;
当“=”的左操作数是p时,改变的是p所指向的地址。
数组的变量名b表示该数组的首地址,因此p=b;也是正确的。
先说一下关于指针的话题:既然可以使用:int
m来代表变量,为什么要设计指针这种变量类型呢?指针一般用于对数组或者连片的内存的访问(这里连片的内存的每一个单元的数据类型是已知的)。对于int
m来说,我们只关心m,对m前后的地址的数据不感兴趣,但是对于数组或内存区,由于他们的每一个单元的数据类型是已知的,那么,访问数组中的各个元素,除了使用:b[0],b[1],b[2]...之外,还可以使用指针的移动:p=b[0];p+1=b[1],...来访问,这样就更加便利;试想,对于多维数组:c[2][3][4],要访问其中一个元素,或者访问其中一行、或者一列数据,使用下标表示的形如c[2][3][4]的表达方法就比较笨拙了,使用指针的移动,就不在需要知道具体的指针代表的变量的具体名称(是c[2][3][4]还是c[0][1][3]),这样就很灵活和方便。
既然指针有上述性质和优势,下面对上面的4句话分别解释一下:
1、“指针的赋值,“=”的左操作数可以是*p,也可以是p。”
指针实际也是一个变量,这个变量实际上是这个指针代表的变量(实际变量,例如整形变量、char型变量)的地址。这样,我们用指针表示地址,用*p表示这个地址指向的变量的具体数字。但无论如何,指针p和*p(p代表的具体数字)均为变量,因此可以用于赋值的左操作数;
2、“当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;”
当左操作数是*p时,*p实际上代表的是某个具体数值,这与int
m中的m代表某个具体数值是一样的,也就是说,*p=2与m=2是等价的,所以,此时,赋值的右操作数应该是具体的数据,而这个与m等价的*p中的p是一个地址,*p=2,改变的是地址中的数据,而未改变指针(地址),所以说:改变的是p所指向的地址存放的数据;
3、“当“=”的左操作数是p时,改变的是p所指向的地址。”
上面的“2”理解了,这里就可以对照比较了。
当左操作数是p时,p是某个地址(至于该地址存储的具体数据,也就是*p是多少,我们不关心),所以,为了赋值语句的语法正确,右操作数也应该是一个地址,而不是具体的数据(int型、char型等等都不是地址);所以,语句:p=&m(&操作符是取地址运算符,无论m是什么类型,&m都给出m的地址)才是合法的;
4、“数组的变量名b表示该数组的首地址,因此p=b;也是正确的。”
还是这句话:上面的“3”理解了,这里就可以对照比较了。呵呵
数组变量在C语言中是比较特殊的,与int
m中,m只代表m中的具体数据,只有&m表示变量m的地址所不同的是:int
b[3]中的数组变量a代表的是数组的“首”地址,也就是b[0]的地址,虽然前面的定义表明b是int型的地址。需要区别的是:b代表地址,b[0]才代表具体数据。这样:p=b,赋值符左右两侧均为地址,就合法了。
最后,利用题目中给出的例子总结一下:
int
*p;
int
a;
int
b[1];
p
=
&a;
p
=
b;
p为int型指针;a是int型变量;b是int型数组,所以,b(本身)表示int地址
那么,p
=
a,地址
=
数据,不合法;
p=&a,地址
=
地址,合法;
p=b,地址
=
地址,合法;
但是:p
=
b[0],地址
=
数据,不合法;
指针的赋值,“=”的左操作数可以是*p,也可以是p。
当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;
当“=”的左操作数是p时,改变的是p所指向的地址。
数组的变量名b表示该数组的首地址,因此p=b;也是正确的。
先说一下关于指针的话题:既然可以使用:int
m来代表变量,为什么要设计指针这种变量类型呢?指针一般用于对数组或者连片的内存的访问(这里连片的内存的每一个单元的数据类型是已知的)。对于int
m来说,我们只关心m,对m前后的地址的数据不感兴趣,但是对于数组或内存区,由于他们的每一个单元的数据类型是已知的,那么,访问数组中的各个元素,除了使用:b[0],b[1],b[2]...之外,还可以使用指针的移动:p=b[0];p+1=b[1],...来访问,这样就更加便利;试想,对于多维数组:c[2][3][4],要访问其中一个元素,或者访问其中一行、或者一列数据,使用下标表示的形如c[2][3][4]的表达方法就比较笨拙了,使用指针的移动,就不在需要知道具体的指针代表的变量的具体名称(是c[2][3][4]还是c[0][1][3]),这样就很灵活和方便。
既然指针有上述性质和优势,下面对上面的4句话分别解释一下:
1、“指针的赋值,“=”的左操作数可以是*p,也可以是p。”
指针实际也是一个变量,这个变量实际上是这个指针代表的变量(实际变量,例如整形变量、char型变量)的地址。这样,我们用指针表示地址,用*p表示这个地址指向的变量的具体数字。但无论如何,指针p和*p(p代表的具体数字)均为变量,因此可以用于赋值的左操作数;
2、“当“=”的左操作数是*p时,改变的是p所指向的地址存放的数据;”
当左操作数是*p时,*p实际上代表的是某个具体数值,这与int
m中的m代表某个具体数值是一样的,也就是说,*p=2与m=2是等价的,所以,此时,赋值的右操作数应该是具体的数据,而这个与m等价的*p中的p是一个地址,*p=2,改变的是地址中的数据,而未改变指针(地址),所以说:改变的是p所指向的地址存放的数据;
3、“当“=”的左操作数是p时,改变的是p所指向的地址。”
上面的“2”理解了,这里就可以对照比较了。
当左操作数是p时,p是某个地址(至于该地址存储的具体数据,也就是*p是多少,我们不关心),所以,为了赋值语句的语法正确,右操作数也应该是一个地址,而不是具体的数据(int型、char型等等都不是地址);所以,语句:p=&m(&操作符是取地址运算符,无论m是什么类型,&m都给出m的地址)才是合法的;
4、“数组的变量名b表示该数组的首地址,因此p=b;也是正确的。”
还是这句话:上面的“3”理解了,这里就可以对照比较了。呵呵
数组变量在C语言中是比较特殊的,与int
m中,m只代表m中的具体数据,只有&m表示变量m的地址所不同的是:int
b[3]中的数组变量a代表的是数组的“首”地址,也就是b[0]的地址,虽然前面的定义表明b是int型的地址。需要区别的是:b代表地址,b[0]才代表具体数据。这样:p=b,赋值符左右两侧均为地址,就合法了。
最后,利用题目中给出的例子总结一下:
int
*p;
int
a;
int
b[1];
p
=
&a;
p
=
b;
p为int型指针;a是int型变量;b是int型数组,所以,b(本身)表示int地址
那么,p
=
a,地址
=
数据,不合法;
p=&a,地址
=
地址,合法;
p=b,地址
=
地址,合法;
但是:p
=
b[0],地址
=
数据,不合法;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
需要,一般都初始化在指针的第一位
追问
那为什么有些程序中,直接就定义了一个指针,没有初始化,
int *p;
就像这样,行不行???
追答
不会吧,一般的都会指向头指针。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2011-09-17
展开全部
要初始化
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询