❶ c语言 什么是间接引用(indirection)
间接引用,通俗的讲就是使用指针的指针
如:
int a;//定义整型变量,为其分配内存空间,假设为0xaaaaaaa
int *p;//定义指针,分配内存空间,假设为0xbbbbbbb
p=&a;//指针变量名p表示的是指针变量本身的值,而不是其地址
所以,这个语句执行后,p本身所在的内存地址不变,而是里面的数据改变了。p=0xaaaaaaa,也就是地址0xbbbbbbb里的数据变成0xaaaaaaa
*p=5;//直接引用,往p,也就是地址0xaaaaaaa 写入数据5。
int **pp;//定义指针的指针,分配内存空间,假设为0xcccccccc
pp=&p;//,0xcccccccc这个内存地址里的数据是p的地址,也就是0xbbbbbbbb
**pp=5;//间接引用,我们通过pp的地址0xcccccccc,取得里面的数据0xbbbbbbbb,再通过这个数据0xbbbbbbbb,知道a的地址,往里写入数据,给a赋值5
❷ C语言空指针是怎么回事
空指针指的就是NULL
也就是0指针
指针的含义 是一个地址。 而0地址是非法地址。对这个地址进行赋值 或者取值 就会出现空指针错误
在实际编程中,经常把指针初始化为空指针, 在访问的时候进行判断, 如果为空,那么就是还没有正确赋值的, 应该避免访问。
❸ c语言 关于空指针问题
1.
if(y
==
NULL
&&
w
==
NULL
&&
d
==
NULL)这个语法上是对的,但是逻辑上不对,应该任何变量为空指针都不能执行,所以改为if(y
==
NULL
||
w
==
NULL
||
d
==
NULL)
2.
if...else...
的用法问题,else后并不是一定要再加if的。而且if后面一定要有条件。
3.
循环只要是收敛的就可以用,但是要记得初始化
a=a初值;
b=b初值;
epsilon
=较小值;
for(c
=
abs(a-b);
c<epsilon
;
c
=
abs(a-b);){
a
=
(a+b)/2;
b
=
sqrt(a*b);
}
4.
要修改y,w,d所指向的值,所以要用指针。否则直接用int
y,w,d的话只能修改函数内部变量,不能带出函数。(形参和实参的概念)
程序修改如下:
int
convertTime(int
days,
int
*y,
int
*w,
int
*d){
if(days
<
0){
return
1;
}
else
if(y
==
NULL
||
w
==
NULL
||
d
==
NULL){//去掉多余的if,并修改&&为||
return
1;
}
else{//去掉多余的if
int
a
=
days%365;
*y
=
days
/
365;
//可以直接这么写,由于分子分母都是整数,所以这里的除号是做整除
*w
=
a
/
7;
*d
=
a
%
7;
return
0;
}
}
❹ C语言中对指针变量的直接和间接引用怎么区别
引用相比于于指针各有优点:一、引用变量它不能改变自身所引用的地址空间,而指针变量可以,那么就很可能出现一些因为不小心的修改而导致错误的结果。二、在作为函数参数方面,引用作为参数,你调用的时候不需要对变量取地址值,这样看起来比较直观,而且方便,如果是指针变量作为参数,那么你有时候会不明白这个函数到底是对指针进行运算,还是对指针指向的变量空间进行运算,而且还要取地址操作。三、不过有时候指针还是比引用好用的多,不如你需要快捷修改指向位置,那么指针是很快的,有时候你就是要对地址(就是直接对内存)操作,那么指针是首选啦。 下面是一个例子希望对你有用: //PointAndRef.cpp#include<iostream.h> //cout<< void pointFun(int *a,int *b) //指针作为参数{
int temp;
temp=*a;
*a = *b;
*b=temp;
}void refFun(int &a,int &b) //引用作为参数
{
int temp;
temp=a;
a=b;
b=temp;
}
void main()
{
int a,b;
a=1,b=2;
pointFun(&a,&b); //指针调用需要取地址值。
cout<<"a="<<a<<"b="<<b<<endl;
int c,d;
c=3,d=4;
refFun(c,d); //引用调用和正常变量调用一样。
cout<<"c="<<c<<"d="<<d<<endl;
}
❺ C语言中,空指针的使用意义是什么在编程中使用空指针会带来什么影响
语言定义中说明,每一种指针类型都有一个特殊值——“空指针”——它与同类型的其它所有指针值都不相同,它“与任何对象或函数的指针值都不相等”;
不要返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
指针是个很强大的工具,可是正因为它太强大,所以要操作它不是件易事。操作不当造成的野指针,甚至会引起系统死机等比较严重的后果。
如果程序定义了一个指针,就必须要立即让它指向一个我们设定的空间或者把它设为NULL,如果没有这么做,那么这个指针里的内容是不可预知的,即不知道它指向内存中的哪个空间(即野指针),它有可能指向的是一个空白的内存区域,可能指向的是已经受保护的区域,甚至可能指向系统的关键内存,如果是那样就糟了,也许我们后面不小心对指针进行操作就有可能让系统出现紊乱,死机了
❻ c语言,空指针,野指针,通用指针
空指针:空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。
通用指针:通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
野指针:野指针也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
空指针是一个特殊的指针值,也是唯一一个对任何指针类型都合法的指针值。指针变量具有空指针值,表示它当时处于闲置状态,没有指向有意义的东西。空指针用0表示,C语言保证这个值不会是任何对象的地址。给指针值赋零则使它不再指向任何有意义的东西。为了提高程序的可读性,标准库定义了一个与0等价的符号常量NULL. 程序里可以写 p = 0; 或者 p = NULL; 两种写法都把p置为空指针值。相对而言,前一种写法更容易使读程序的人意识到这里是一个指针赋值。我们印象中C语言的指针都有类型,实际上也存在一种例外。
这里涉及到通用指针,它可以指向任何类型的变量。通用指针的类型用(void *)表示,因此也称为void 指针。
野指针,也就是指向不可用内存区域的指针。通常对这种指针进行操作的话,将会使程序发生不可预知的错误。
“野指针”不是NULL指针,是指向“垃圾”内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。野指针的成因主要有两种:
①指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它会乱指一气。所以,指针变量在创建的同时应当被初始化,要么将指针设置为NULL,要么让它指向合法的内存。
②指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。