Ⅰ.
通常要求同一逻辑结构中的所有数据元素具有相同的特性,这意味着(不仅数据元素所包含的数据的个数要相同,而且对应数据项的类型要一致)
数据的存储结构是指(数据的逻辑结构在计算机中的表示)
Ⅱ.
Ⅲ.
类型起别名——typedef
关键字typedef用于为系统固有的或程序员自定义的数据类型定义的一个别名,如:
Ⅰ
typedef struct student
{
char number[5];
char name[11];
int shu1;
int shu2;
int shu3;
};
int main()
{
struct student stud[11];
scanf("%s %s %d %d %d",&stud[i].number,&stud[i].name,&stud[i].shu1,&stud[i].shu2,&stud[i].shu3);
}
Ⅱ
typedef struct student
{
char number[5];
char name[11];
int shu1;
int shu2;
int shu3;
}student1;//student1是类型名,类型起别名
int main()
{
student1 stud[11];
scanf("%s %s %d %d %d",&stud[i].number,&stud[i].name,&stud[i].shu1,&stud[i].shu2,&stud[i].shu3);
}
————————————————
版权声明:本文为CSDN博主「ZVAF_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ZVAF_/article/details/111183337
变量起别名——引用(c++)
类型标识符 &引用名 = 目标变量名
1.注意:
引用在定义时必须初始化
int a=10;
int &b=a;//正确
int a=10;
int &b;
&b=a;//会报错
引用在初始化时只能绑定左值不能绑定常量值
引用一旦初始化,其值就不能再更改,即不能再做别的变量的引用
数组不能定义引用
2.引用与指针
不存在空引用,引用必须连接到一块合法的内存
一旦引用被初始化为一个对象,就不能被指向到另一个对象,指针可以在任何时候被指向另一个对象
引用必须在创建时被初始化,指针可以在任何时候被初始化
3.应用
主要应用是将它作为函数的参数,以扩充函数传递数据的功能,引用作函数参数是区别于值传递与址传递的引用传递,形参变化实参也发生变化
Ⅳ.值传递,址传递,引用传递(在C语言中,参数传递的机制只有一种,就是值传送)
值传递(形参变化实参不变)
#include <stdio.h>
void mySwap(int, int);
int main()
{
int a = 20,b = 30;
mySwap(a, b);
printf("%d %d\n", a, b);
return 0;
}
void mySwap(int m, int n)
{
int t = m;
m = n;
n = t;
}
程序执行结果为:
20 30
。
可以简单的理解为:
在进行函数调用时隐含的把实参a,b的值分别赋给了m,n,在函数调用过程中并没有对a,b进行任何操作
实际上是:
随着 swap 函数的结束,被作为局部参数的形参m,n以及 swap 函数本身的局部参数t都将结束其生存期,在内存中的储存空间释放,因此实参a,b并未受到影响
址传递
#include <stdio.h>
void mySwap(int*, int*);
int main()
{
int a = 20,b = 30;
mySwap(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
void mySwap(int *m, int *n)
{
int t = *m;
*m = *n;
*n = t;
}
程序执行结果为:
30 20
。
看函数的接口部分:mySwap (int *m, int *n),请注意参数px,py都是指针
再看调用处:mySwap (&a, &b); 它将 a 的地址 &a 代入到 m,b 的地址 &b 代入到 n。同上面的值传递一样,函数调用时做了两个隐含的操作,将 &a ,&b 的值赋给了m,n。
整个 mySwap 函数调用执行如下:
m=&a;
n=&b; //请注意这两行,它是调用 swap 的隐含动作。
int t=*m;
*m=*n;
*n=t;
printf("*m=%d,*n=%d\n",*m, *n);
这样,有了头两行的隐含赋值操作,我们现在已经可以看出,指针 m,n 的值已经分别是 a,b 变量的地址值了。接下来,对 *m,*n 的操作当然也就是对 a,b 变量本身的操作了。所以函数里头的交换就是对 a,b 值的交换了,这就是所谓的址传递(传递 a,b 的地址给 m,n)
总结:
在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的“值传递”,即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。
#include <stdio.h>
void mySwap(int*, int*);
int main()
{
int a = 20,b = 30;
mySwap(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
void mySwap(int *m, int *n)//不能实现交换的传递
{
int *t = m;
m = n;
n = t;
}
程序执行结果为:
20 30
。
引用传递
#include<stdio.h>
void swap(int &m,int &n){
int t=m;
m=n;
n=t;
}
int main(){
int a=20,b=30;
swap(a,b);
printf("%d %d",a,b);
return 0;
}
程序执行结果为:
30 20
。
Ⅴ.输入输出的实现
以输入1~n的的和为例
1.使用输入输出函数
void sum(){
scanf("%d",&n);
s=0;
for(int i=1;i<n;i++)
s+=i;
printf("%d",s);
}
2.使用全局变量
int s;
void sum(int n){
s=0;
for(int i=1;i<=n;i++)
s+=i;
}
3.使用参数
#include<stdio.h>
void sum(int n,int *s){//址传递
*s=0;
for(int i=1;i<=n;i++)
*s+=i;
}
int main(){
int n;
scanf("%d",&n);
int s;
sum(n,&s);
printf("%d",s);
return 0;
}
#include<stdio.h>
void sum(int n,int &s){//引用传递
s=0;
for(int i=1;i<=n;i++)
s+=i;
}
int main(){
int n;
scanf("%d",&n);
int s;
sum(n,s);
printf("%d",s);
return 0;
}
Ⅵ
cin不能用来输入空格,在输入含空格的字符数组时用scanf,同时也要注意字符数组输入时的换行(getchar)