practice

1、char s[] = “china”;

char *p;

p=s;

则下列叙述正确的是(D )。

A.s和p完全相同

B.数组s中的内容和指针变量p中的内容相等

C.s数组长度和p所指向的字符串长度相等

D.*p与s[0]相等

tips: D. *p与s[0]相等
解释:指针p指向数组s的第一个元素,因此*p(解引用指针p)和s[0](数组s的第一个元素)都是‘c’,所以它们是相等的。

A. s和p完全相同
解释:s是一个数组名,表示数组的起始地址,而p是一个指针变量。虽然它们指向同一内存位置,但它们的类型不同。s是一个数组类型,而p是一个指针类型,二者并不完全相同。

B. 数组s中的内容和指针变量p中的内容相等
解释:这个说法不准确,因为“内容”一词可能引起误解。虽然p指向s的起始地址,因此*p的内容等于s[0]的内容,但p本身并不存储数组的完整内容,而是指向数组的地址。

C. s数组长度和p所指向的字符串长度相等
解释:s数组的长度是固定的(在这个例子中是6,包括结束符‘\0’),而p是一个指针,它并不持有长度信息。虽然p指向的字符串“china”的长度(不包括结束符)是5,但p并没有存储这个长度信息。因此,这个说法是不准确的。


2、已知:int n, i=1, j=2; 执行语句 n=i<j ? i++ : j++; 则i和j的值是( C)。

A.1, 2

B.1, 3

C.2, 2

D.2, 3

tips:

要分析这段代码,首先执行条件判断 i < j。因为 1 < 2 为真,所以会执行 i++。此时,i 的值从 1 增加到 2,但表达式返回的是 1(执行前的值)。j 的值保持为 2。最终,i和 j 的值为 2 和 2,所以答案是 C. 2, 2。


3、链式栈与顺序栈相比,一个比较明显的优点是( B)。

A.插入操作更加方便

B.通常不会出现栈满的情况

C.不会出现栈空的情况

D.删除操作更加方便

tips:链式栈与顺序栈相比,一个比较明显的优点是 B. 通常不会出现栈满的情况。链式栈通过节点动态分配内存,不受固定大小限制.


4、下列哪些语句关于内存回收的说明是正确的(C )。

A.程序员必须创建一个线程来释放内存

B.内存回收程序负责释放无用内存

C.内存回收程序允许程序员直接释放内存

D.内存回收程序可以在指定的时间释放内存对象

tips:

A. 程序员必须创建一个线程来释放内存:错误。在 C 语言中,程序员并不需要创建线程来释放内存。内存的释放是通过调用 free 函数完成的,与线程无关。

B. 内存回收程序负责释放无用内存:部分正确,但不适用于 C 语言。C 语言没有内置的内存回收程序,程序员需要手动释放不再使用的内存。

C. 内存回收程序允许程序员直接释放内存:正确。在 C 语言中,程序员使用 free 函数手动释放之前分配的内存(例如使用 malloc、calloc 或 realloc),这相当于“直接释放内存”。

D. 内存回收程序可以在指定的时间释放内存对象:错误。C 语言没有自动内存回收机制,内存释放的时机完全由程序员控制,程序员不能指定特定时间来释放内存。


5、下面关于关键字的描述及使用中,错误的是( D)。

A.volatile可用于定义多线程应用中的共享变量

B.const可用于定义全局变量

C.一个变量既可以是 const,同时也是volatile

D.register static int i = 0

tips:

A. volatile可用于定义多线程应用中的共享变量:正确。volatile 关键字用于告诉编译器某个变量可能在程序的其他部分(如多线程环境)被异步修改,因此编译器不会优化对这个变量的访问,确保每次访问都从内存中读取其最新值。

B. const可用于定义全局变量:正确。const 关键字可以用于定义全局变量,这意味着该变量的值在定义后不能被修改。

C. 一个变量既可以是 const,同时也是 volatile:正确。在 C 和 C++ 中,一个变量可以同时被声明为 const 和 volatile。这表示变量的值不应该被修改(const),但可能在程序的其他地方(如中断处理程序或多线程环境)被改变(volatile)。

D. register static int i = 0:错误。register 和 static 不能同时用于同一个变量。register 表示希望将变量存储在寄存器中以提高访问速度,而 static 表示变量的生命周期为整个程序运行期间。两者的含义互相矛盾,因此不能同时使用。


6、在C语言中,如果下面的变量都是int类型,则输出结果是 7 。

sum = pad =5;

pad = sum++, pad++, ++pad;

printf(“%d\n”, pad);

tips:

初始化:sum = pad = 5;

这时 sum 和 pad 都是 5。
语句:pad = sum++, pad++, ++pad;

sum++:这个表达式的值是 5(因为是后缀递增),但 sum 会在此语句执行后增加到 6。
pad++:这个表达式的值也是 5,pad 会在此语句执行后增加到 6。
++pad:此时 pad 的值是 6,经过前缀递增后,pad 变为 7,表达式的值是 7。
在此语句执行后,pad 的最终值是 7,因为赋值是从右到左执行。

最后,执行 printf("%d\n", pad);,输出的是 pad 的当前值。
所以,输出结果是 7。


7、使用冒泡算法实现对一维数组A中的10个元素进行排序。

int sort(int *p,int n)
{
	int i,j;
	for(i=0; i<n-1; i++)
	{
		for(j=0; j<n-1-i; j++)
		{
			if(p[j]>p[j+1])
			{
				int temp;
				temp=p[j];
				p[j]=p[j+1];
				p[j+1]=temp;
			}
		}
	}
	return 0;
}
int main()
{
	int i;
	int buf[10]={10,7,98,2,963,9,815,74,56,589};
	sort(buf,10);
	for(i=0; i<10; i++)
		printf("排序之后: %d\n",buf[i]);
	return 0;
}


8、用户输入M、N值,从1至N开始顺序循环数数,每数到M的倍数输出该数值,自至全部输出。写出C程序

int main()
{
	int i,N,M;
	scanf("%d%d",&N,&M);
	for(i=1;i<=N;i++)
	{
		if(i%M==0)
		{
			printf("%d\n",i);
		}
	}
	return 0;
}


9、用C语言实现函数功能:找出一个整数数组中,第二大的数。

int find_sec_max(int data[], int count)
{
	int max = data[0];//max取数组的第一个元素
	int sec_max;//定义第二大的数
	for (int i = 1; i < count; i++)
	{
		if (data[i] > max)
		{
			sec_max = max;
			max = data[i];			
		}
		else
		{
			if (data[i] > sec_max)
			{
				sec_max = data[i];
			}
		}
	}
	return sec_max;
}

int main()
{
	int arr[] = {1,5,3,6,4,7,8,10};
	int secondnum = find_sec_max(arr,(sizeof(arr)/sizeof(arr[0])));
	printf("%d\n",secondnum);
	return 0;
}

posted @ 2024-09-26 20:26  WJnuHhail  阅读(58)  评论(0)    收藏  举报