c语言笔记第六天:extern,引用,排序
c语言笔记第六天:extern,引用,排序,使用函数目的:1.程序复用2.提高主程序结构的清晰性和易读性3.使程序的调试和维护更容易。
数组名是一个符号常量,不能被修改
取余的时候不能用小数
引用是另一个变量的别名,引用本身不占用内存空间,必须在声明时初始化
希尔排序法的基本思想是:将整个无序序列分割成若干小的子序列分别进行插入排序。
数据的完整性是指数据的正确性、有效性和相容性
extern:外来的
下面语句的输出结果是________。
printf("%d\n",strlen("\t\"\065\xff\n"));
A)14 B)8
C)5 D)输出项不合法,无正常输出
答案:C
评析:在c语言中,以“\”开头的字符均为转义字符,其中“\”后可跟1~3位八进制数或在“\”后跟字母x及1~2位十六进制数,以此来代表一个特定的字符。
malloc 和 new 至少有两个不同: new 返回指定类型的指针,并且可以自动计算所需要大小。
而 malloc 则必须由我们计算要字节数,并且在返回后强行转换为实际类型的指针。
int *p;
p = new int; //返回类型为int* 类型(整数型指针),分配大小为 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回类型为 int* 类型(整数型指针),分配大小为 sizeof(int) * 100;
int* p;
p = (int *) malloc (sizeof(int));
比如想分配100个int类型的空间:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100个整数的内存空间。
1.一般将数据结构分为两大类型:线性结构与非线性结构。线性表、栈与队列、线性链表都是线性结构,而二叉树是非线性结构。
2.
若进栈序列为1,2,3,4,进栈过程中可以出栈,则下列不可能的一个出栈序列是_______。
A)1,4,3,2 B)2,3,4,1
C)3,1,4,2 D)3,4, 2,1
答案:C
评析:栈是一种后进先出表,选项c中,先出栈的是3,说明此时栈内必然有1,2,由于1先于2进栈,所以l不可能在2之前出栈,故选项C这种出栈序列是不可能的。
3.
对于n个结点的单向链表(无表头结点),需要指针单元的个数至少为_______。
A)n-1 B)n C)n+1 D)2n
答案:C
评析:在n个结点的单向链表(无表头结点)中,每个结点都有一个指针单元(即指针域),加上头指针,至少需要n+1个指针单元。
4.
若有以下类型说明语句:
char w;int x;float y,z;
则表达式w*x+z-y的结果为________类型。
A)float B)char C)int D)double
答案:A
评析:在进行运算时,不同类型的数据参加运算,需要先将其转换成同一类型的数据,然后再进行运算。转换的顺序由低到高为:char,short→int→unsigned→long→double→float,故结果为float型。
5.
问题一:写出冒泡排序
void pop_sort(int a[],int N)
{
int tmp, i , j;
for(j=0; j for( i=0; i<9-j; i++)
if( a[i]>a[i+1])
{
tmp=a[i];
a[i]=a[i+1];
a[i+1]=tmp;
}
}
问题一:写出选择法排序
void select_sort(int a[],int N)
{
int i , j, k, t;
for(i=0; i k=i;
for( j=i+1; j if( a[j] k=j;
tmp=a[k];
a[k]=a[i];
a[i]=tmp;
} }
6.
设有int a=3;则执行语句a+=a-=a*a;后 变量a的值是? 答案:-12
7.
1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。( 正确 ) 2、int (*ptr) (),则ptr是一维数组的名字。(错误 int (*ptr) ();定义一个指向函数的指针变量 )
3、指针在任何情况下都可进行>, <,>=, <=,==运算。( 错误 ) 4、switch(c) 语句中c可以是int ,long,char ,float ,unsigned int 类型。( 错,不能用实形 )
8.
交换两个变量的值,不使用第三个变量。即a=3,b=5,交换之后a=5,b=3; 答案:有两种解法, 一种用算术算法, 一种用^(异或) a = a + b; b = a - b; a = a - b;
or a = a^b; b = a^b; a = a^b; or a ^= b ^= a; // 只能对int,char.
9.
程序的局部变量存在于(栈)中,全局变量存在于(静态区 )中,动态申请数据存在于( 堆)中。
10.
#include
void main()
{
int a[]={1,2,3,4,5,6,7,8,9,10,11,12};//对数组a初始化
int *p[3];//定义指针数组,每一个元素都是指针
int m;//定义变量m
for(m=0;m<3;m++)//循环三次
p[m]=&a[m*4];
/**************开始分析循环语句******************
m=0时,p[0]=&a[0] ,p[0]指向a[0]
m=1时,p[1]=&a[4] ,p[1]指向a[4]
m=2时,p[2]=&a[8] ,p[2]指向a[8]
*************************************************/
printf("%d\n",p[2][2]);
// 相当于p[2]+2 因为p[2]指向a[8],故p[2][2]指向a[10]
//a[10]所对应的值是11 ,故输出11
}答案是11 ,它定义了一个指针数组 int *p[3] 里面的元素是指针,有3个元素,每个指针都可以指向一个数组。 执行for循环时 第三个元素指针 p[2]=&a[2*4] 也就是p[8] ,
也就是p[2][0]=a[8]
p[2][2] 就是再向后数三个元素,也就是 11
11.
能否返回局部变量的指针或引用?
不能,因为函数中的局部变量在函数调用结束后就会被释放,
为什么不能返回局部指针变量,却可以返回局部变量
函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,但是对于静态变量也可以返回其指针。
12.
如何引用一个已经定义过的全局变量?
有两种方法:
(1)引用头文件的方式
(2)在extern关键字声明
注意:
(1)如果是头文件的方式,在用全局变量的时候,把变量名字写错了,在编译的时候就会报错。
(2)如果是extern关键字声明,如果把全局变量的名字写错了,在编译的时候不会报错,在连接的时候报错。
13.
使用malloc分配五个空间,存储五个整形元素,键盘输入
#include
#include
int main()
{
int i;
int *t= ( int * )malloc( sizeof( int ) * 5);
for ( i = 0; i < 5; i++)
{
scanf("%d",t+i);
}
for ( i = 0; i < 5; i++)
{
printf("%d",t[i]);
}
free(t);
return 0;
}
14.
#include
void f()
{
int count = 100;//栈区
printf("%d\n",count);
count++;
}
int main()
{
f();
f();
f();
return 0;
}
结果为100 100 100,count为局部变量,存放在栈区,每次函数调用完都会被回收
改成static int count = 100;结果变为100,101,102.