C语言之指针部分必备练习题

1.

语言中哪一种形式声明了一个指向char类型变量的指针p,p的值不可修改,但p指向的变量值可修改?( )

作业内容

A.const char *p

B.char const *p

C.char*const p

D.const char *const p

答案解析:

A:错误,const修饰*p,表示p指向的内容不能修改

B:错误,同上

C:正确,const修饰p本身,表示p的指向不能修改,p指向的空间中内容可以修改

D:错误,第一个const表示p指向的内容不能修改,第二个const表示p不能指向其他变量

因此,选择C

2.

以下关于指针的说法,正确的是( )

作业内容

A.int *const p与int const *p等价

B.const int *p与int *const p等价

C.const int *p与int const *p等价

D.int *p[10]与int (*p)[10]等价

 

答案解析:

A:错误,int* const p中,const修饰指针变量p本身,表示p的指向不能改变,

  int const *p中,const修饰p指针解引用之后的结果,表示p指向的内容不能改变

  因此,不等价

B:错误,同上

C:正确,const都修饰p指针解引用之后的结果,表示p指向的内容不能改变

D:错误,int *p[10]定义了一个指针数组,数组中10个元素,每个元素都是int*类型的指针

  int (*p)[10]定义了一个数组指针,该指针只能指向存储10个整形元素的数组

因此:选择C

3.

程序死循环解释

作业内容

VS开发环境调试下面的代码,画图解释下面代码的问题

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello bit\n");
    }
    return 0;
}

 答案解析为:

程序崩溃的原因在于数组越界访问

对于该程序,访问不属于该数组的元素!

 

 

答案解析:

以下代码有两个问题:1. 数组访问越界   2. 死循环

 以下代码再vs2013下会造成死循环,原因:

 栈内存:

         |CC  CC  CC  CC|

         arr[0]|01  00  00  00|\

         arr[1]|02  00  00  00| \

         arr[2]|03  00  00  00|  \

         arr[3]|04  00  00  00|   \

         arr[4]|05  00  00  00|    \

         arr[5]|06  00  00  00|    /  arr的空间

         arr[6]|07  00  00  00|   /

         arr[7]|08  00  00  00|  /

         arr[8]|09  00  00  00| /

         arr[9]|0A  00  00  00|/

               |CC  CC  CC  CC|

               |CC  CC  CC  CC|

               |00  00  00  00| i的空间

               |CC  CC  CC  CC|

for循环中,i的内容是从0,一直增加到12,而数组只有10个空间,因此会越界

每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位     置恰好为i的位置,即a[12]恰巧将i设置为0,因此造成死循环。

4.

调整奇数偶数顺序

作业内容

调整数组使奇数全部都位于偶数前面。

题目:

输入一个整数数组,实现一个函数,

来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,

所有偶数位于数组的后半部分。

参考代码为:

#include <stdio.h>

void fun(int* arr, int sz)
{
	int i = 0;
	int* left = arr;
	int* right =arr+ sz - 1;
	while (left < right)  //调整数组使奇数(数组元素)全部都位于偶数前面。
	{
		while (*left % 2 == 1)
		{
			left++;
		}
		while (*right % 2 == 0)
		{
			right--;
		}
		if (left < right)
		{
			int tmp = *left;
			*left = *right;
			*right = tmp;
		}
	}
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };

	int sz = sizeof(arr) / sizeof(arr[0]);
	fun(arr, sz);
	
	return 0;
}

 代码的运行结果为:

 另一种思路为:

/*
思路:
1. 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置
2. 循环进行一下操作
 a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环
 b. left从前往后找,找到一个偶数后停止
 c. right从后往前找,找到一个奇数后停止
 d. 如果left和right都找到了对应的数据,则交换,继续a,
*/
void swap_arr(int arr[], int sz)
{
	int left = 0;
	int right = sz-1;
	int tmp = 0;
 
 
	while(left<right)
	{
     // 从前往后,找到一个偶数,找到后停止
		while((left<right)&&(arr[left]%2==1))
		{
			left++;
		}
     
		// 从后往前找,找一个奇数,找到后停止
		while((left<right)&& (arr[right]%2==0))
		{
			right--;
		}
     
     // 如果偶数和奇数都找到,交换这两个数据的位置
     // 然后继续找,直到两个指针相遇
		if(left<right)
		{
			tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}

5.

strcpy实现

作业内容

模拟实现库函数strcpy

 

//库函数strcpy函数的实现  
//strcpy函数是字符串拷贝函数

#include <stdio.h>

void my_strcpy(int* arr1[], int* arr2[],int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		arr1[i] = arr2[i];
		
	}

}
int main()
{
	int arr1[10] = { 0 };
	int arr2[10] = { 1,2,3,4,5,6,7,8,9,0 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	my_strcpy(arr1, arr2, sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr1[i]);
	}
	return 0;
}

代码的运行结果为:

 6.

strlen实现

作业内容

模拟实现库函数strlen

//strlen是一个只负责字符串的库函数!
//计算的是字符串 \0 之前的长度,不包括\0

#include <stdio.h>

int my_strlen(char* arr)   //千万不能写成  char* arr[]
{
	
	int count = 0;
	while (*arr)
	{
		count++;
		arr++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdefgh";
	
	int len = my_strlen(arr);
     printf("%d\n", len);

	return 0;
}

 代码的运行结果为:

 7.牛客网链接为:有序序列判断_牛客题霸_牛客网 (nowcoder.com)

 有序序列判断

 

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。

数据范围: 3 \le n \le 50 \3≤n≤50  序列中的值都满足 1 \le val \le 100 \1≤val≤100 

输入描述:

第一行输入一个整数N(3≤N≤50)。

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

示例1

输入:

5
1 6 9 22 30

输出:

sorted

示例2

输入:

5
3 4 7 2 10

输出:

unsorted

示例3

输入:

5
1 1 1 1 1

输出:

sorted

参考代码为:

#include <stdio.h>
int main()
{
    int a[50]={0};
    int n = 0;
    int  flag1 = 0;
    int flag2 = 0;
    int i = 0;
    scanf("%d", &n);
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a[i]);
        if (i > 0)
        {
            if (a[i] < a[i - 1])
            {
                flag1 = 1;
            }
            else if (a[i] > a[i - 1]) 
            {
                flag2 = 1;
            }
        }
    }
    if (flag1 && flag2)
        printf("unsorted\n");//只有当flag1和flag2都为1的时候序列无序
    else
        printf("sorted\n");
    return 0;
}

 8.牛客网链接为:最高分与最低分之差_牛客题霸_牛客网 (nowcoder.com)

 最高分与最低分之差

 

描述

输入n个成绩,换行输出n个成绩中最高分数和最低分数的差。

输入描述:

两行,第一行为n,表示n个成绩,不会大于10000。

第二行为n个成绩(整数表示,范围0~100),以空格隔开。

输出描述:

一行,输出n个成绩中最高分数和最低分数的差。

示例1

输入:

10
98 100 99 97 95 99 98 97 96 100

输出:

参考代码为:
#include <stdio.h>
 
 
int main()
{
    int n = 0;
    int max = 0;
    int min = 100;
    scanf("%d", &n);
    int i = 0;
    int tmp = 0;//存放内次读取的成绩
    for(i=0; i<n; i++)
    {
        scanf("%d", &tmp);
        if(tmp > max)
            max = tmp;
        if(tmp < min)
            min = tmp;
    }
    printf("%d\n", max-min);
    
    return 0;
}

 

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念君思宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值