欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c语言笔记第六天:extern,引用,排序

程序员文章站 2022-07-03 21:01:55
c语言笔记第六天:extern,引用,排序,使用函数目的:1.程序复用2.提高主程序结构的清晰性和易读性3.使程序的调试和维护更容易。 数组名是一个符号常量,不能被修改 取余的...

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.