1. 请问c语言中引用怎样理解
1、引用的理解
引用是引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。
例如: Point pt1(10,10);
Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:
pt1.offset(2,2);
pt1和pt2都具有(12,12)的值。
引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才
初始化它。例如下面语句是非法的:
Point &pt3;
pt3=pt1;
2、引用的两个主要用途
作为函数参数以及从函数中返回左值。
(1)引用参数
a、传递可变参数
传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现两整数变量值交换的c程序如下:
void swapint(int *a,int *b)
{
int temp;
temp=*a;
a=*b;
*b=temp;
}
使用引用机制后,以上程序的c++版本为:
void swapint(int &a,int &b)
{
int temp;
temp=a;
a=b;
b=temp;
}
调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。
b、给函数传递大型对象
当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:
const maxCard=100;
Class Set
{
int elems[maxCard]; // 集和中的元素,maxCard 表示集合中元素个数的最大值。
int card; // 集合中元素的个数。
public:
Set () {card=0;} //构造函数
friend Set operator * (Set ,Set ) ; //重载运算符号*,用于计算集合的交集 用对象作为传值参数
// friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数
...
}
先考虑集合交集的实现
Set operator *( Set Set1,Set Set2)
{
Set res;
for(int i=0;i<Set1.card;++i)
for(int j=0;j>Set2.card;++j)
if(Set1.elems[i]==Set2.elems[j])
{
res.elems[res.card++]=Set1.elems[i];
break;
}
return res;
}
由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。
Set operator *( Set &Set1,Set &Set2)
{ Set res;
for(int i=0;i<Set1.card;++i)
for(int j=0;j>Set2.card;++j)
if(Set1.elems[i]==Set2.elems[j])
{
res.elems[res.card++]=Set1.elems[i];
break;
}
return res;
}
2、引用返回值
如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:
double &max(double &d1,double &d2)
{
return d1>d2?d1:d2;
}
由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:
max(x,y)+=1.0;
(1)c语言中的结引用扩展阅读
使用c语言中引用的原因
程序按功能划分可分为数值运算、符号处理和I/O操作三类,符号处理程序占相当大的比例,符号处理程序无处不在,编译器、浏览器、Office套件等程序的主要功能都是符号处理。
在程序中通过对函数的调用来执行函数体,其过程与其它语言的子程序调用相似。
C语言中,函数调用的一般形式为:
函数名(实际参数表)
对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。字符函数引用即对引用有关库函数或自定义函数函数。
2. C语言中结构体的成员变量怎么引用
结构体成员运算符。
->指针运算符。
1、如果结构体中的成员均为一般变量(包括结构体变量),则使用“.”,如果成仔扮物员变量为指针(不管指向什么,包括结构体),则使用“->”。
2、如果定义了结构体数组指针,则可分别使用缺陆“.”和“念液->”,区别在于指针带下标时,以是数组形式访问,此时用“.”,如果不带下标(或使用偏移),此时用“->”。如:
struct
myT
{
int
i;
3. C语言中对结构成员的引用问题 求 详细
(51719)
stu 结构体变量
p 指向stu 结构体变量的指针
(A) *p.num
操作符.的优先级高于*操作符,正源所以相当于*(p.num)
p是指针,用.操作符取成员肯定是错误的。
(B) (*p).score
先对p解引用得到结构体对象,然后.操作得到成员,正确。
(C) p->num
p->num=(*p).num 正确
(D) stu.name
取结构体变量成员,正确。
(51720)
A) p.num
p是指针,无法取成员,错误。
(B) student.num
student是结构体名,不是变量,无法取成员,错误。
(C) p->num
=(*p).num,正确。
(D) stu->num
stu非指针,无法用->操作符,锋清渗银脊错误。
4. 关于C语言结一种构体类型的成员引用另外一种结构体成员的值的问题.
你说的这种情况,函数返回的是整个结构体,无论这个结构体中包含了多少个成员,一个结构体就只是一个变量(结构体本身就是一个变量,无论它包含了多少个成员)。这样,函数哪返返返回一个结构体就意味着函数把结构体中所有的成员都返回了。c语言函数的确只能有一个返回值,用返回结构体的方式就很好地解决了需要返回多个返回值的问题。
return后面没世滑有0或1,说明李饥这个函数是void类型的,这类函数本来就不需要有返回值,这里的return的意思并不是要返回某个值,而是退出这个函数的意思。
5. c语言结构体里引用结构体
#include
struct person
{
char name[10];
int num;
};
void main()
{
struct person per[5];
void sort(struct person *, int );
int i;
printf("print letter:\n");
for(i=0;i<5;i++)
{
printf("name: ");
scanf("%s", &per[i].name);
printf("num: ");
scanf("%d", &per[i].num);
}
sort(per, 5);
for(i=0;i<5;i++)
printf("print: %s%d\n", per[i].name, per[i].num);
getch();
}
void sort(struct person *a, int n)
{
int i,j,t;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i].num>a[j].num)
{
t=a[i].num; /*你代码中i写成j,这是细节问题*/
a[i].num=a[j].num;
a[j].num=t;
}
}
你代码有点问题,我给你改了改。TC测试通过。
除了注视的地方,还有几点要注意:
你源代码传送的是per[0].num的地址,记:a[0],但是a[1]的地址不等于
per[1].num的地址。
指针加1的意思你没理解好。
举个列子。
int a[10];
那么*(a+1)的意思是把a地址向后移动sizeof(int)个位。
所以你那个&a[1]指向的还是结构体中的数据。(恩,这里体现了低级语言的特性。每一个内存的每一位都要考虑到。要是你写个程序:200位的浮点数加法计算机,你更能体会到什么叫做考虑到每一位内存,调试的时候要一个内存一个内存的演算。代码我的空间里有,可以自己去看)
不懂的问
6. 关于c语言结构体变量成员引用的问题
(1)、scanf的用法,格式后的参数都必须是地址,name是数组名,本身就是数据,age和sex都是整型数据,必须使用取地址符&;
(2)、p是struct
student*类型,stu是stu[3]这个数组的第一个元素的地址,p指向第一个元素,因此ABC都野迅冲是对的,D错在把(int*)变量值赋值给(struct
student*)变量,如果有个强制转换则不会错,因为age是结构体第一个变量,其地址就是结构体变量的地址。
(3)、昌裤与(2)类似,是指针间的赋值,必须保证左右操作数的指针类型是一致的。由于n是结构体sk的第一个变量,因此其地址与结构体变量地址相同,可以强制转换得到正确的地址。
(4)、c是一个二维数组,p是一个指向数组的指针,因此p的*运算都是得到一个数组,**运算才能取到数组中的值。只颂歼有D是**运算。
7. C语言中如何在多个文件中引用同一个结构体
引用结构体有引用类碰返滚型,和引用全局变量两种方式。
1 引用类型。
需要将结构体定义与头文件中(.h文件),然后在需要引用类型的源文件(.c)中,均引用该头文件,即可使用该类型。
2 引用全局变量。
要引用全局变量,需要先引用类型,之后在一个源文件中定笑余义全局变量,在其它源文件中声明该全局变量,即可使用。
比如结构体为struct test, 定义世神全局变量为
struct test glabol_test;
在其它文件中,只需要
extern struct test globol_test;
即可在对应文件声明所在行之下进行调用。
PS:该声明部分,也可以写在定义结构体的头文件中。
8. C语言中引用指的是什么,举个例子
C语言里面没有引用的说法,只有C++里面有。C++里引用就是给变量定义一个别名,操作这个别名就是操作原变量。
比如,我们定义一个引用:
inta=10;//定义一个普通变量
int&ref=a;//定义一个变量a的引用
ref=20;//这里对ref进行操作其实就是对a进行操作
变量主要是在参数传递的时候非常有用,当你的函数参数是一个值参数的时候,我们一般的做法是传递一个指针进去,这样就导致我们在函数里操作的都是指针,这样其实很不方便,如果使用引用的话就可以非常方便。
比如定义一个参数是引用的函数
voidfunc(int&b)
{
b++;
}
//调用
inta=100;
func(a);//调用的时候直接传递参数进去
上面的方式可以实现和指针一样的效果,但是更加方便
9. c语言中什么叫引用
引用(reference)是c++对c语言的重要扩充。引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*,例如: Point pt1(10,10)。
Point &pt2=pt1;,定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。
需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词,引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。
循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。
四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。