指针经典例题

指针经典例题

1、

alt text

-- 答案是 D。
首先,scanf函数,接收的是地址,排除A,B,而且输出地址的格式是%p,而不是%d。C选项,int *p;没有赋初始值,是野指针,不能给野指针赋值,所以错误。

2、以下正确的程序段是_________.
a)char str[20];scanf("%s",*str);
b)char *p;scanf("%s",p);
c)char str[20];scanf("%s",&str[2]);
d)char str[20],*p=str; scanf("%s",p[2]);

-- 答案是C。A:scanf输入地址,D也错,B:地址是%p,C:%s的特性是,从输入的地址开始遍历,直到遇到'\0'。

3、若有说明语句
char a[]="It is mine";
char *p="It is mine";
则以下不正确的叙述是_______.
a)a+1 表示的是字符 t 的地址
b)p 指向另外的字符串时,字符串的长度不受限制
c)p 变量中存放的地址值可以改变
d)a 中只能存放 10 个字符

--答案是D,长度是不限的

4、下述三个定义有什么区别?
char * const p;
char const * p;
const char *p ;

--(1)const修饰的是p,p的值不能被改变
(2)const修饰的是*p,p的值不能被改变
(3)const修饰的是
p,*p的值不能被改变

5、1、若有以下定义,则对 a 数组元素的正确引用是_________.
int a[5],p=a;
a)
&a[5] b)a+2 c)(p+5) d)(a+2)

--答案选D,a是数组首个元素的地址,a+2,是第3个元素的地址,加个*,就是解地址,就得到元素空间。

6、若有定义:int a[2][3],则对 a 数组的第 i 行 j 列元素地址的正确引用为______.
a)(a[i]+j) b)(a+i) c)(a+j) d)a[i]+j

--答案:D,注意要的是地址还是值。

7、 下面程序段的运行结果是________.
char s[80], *sp = "HELLO!";
sp = strcpy(s, sp);
s[0] = 'h';
puts(sp);

-- 答案:hELLO! --sp = strcpy(s,sp); 将sp指向数组首元素的地址,相当于sp=s;将数值从常量区复制到栈区了,就可以改变了。

8、下面程序段的运行结果是________.
char str[] = "abc\0def\0ghi", *p = str;
printf("%s", p + 5);

--答案是ef --根据%s的特性,从给定的地址开始,直到遇到'\0'结束。所以从数组的第6个元素开始,遇到'\0'结束。

9、以下程序段的执行结果为_______
char *a = "hello";
char c[] = ”hello”;
char *b = ”hello”;
if(a == b)
printf("YES");
else
printf("NO");

--答案是YES,因为常量区中的值不会有重复,相同的值地址是一样的。

10、下面程序的运行结果是
int main()
{
char *a[] = {"Pascal", "C language", "dBase", "Coble"}; //字符指针数组
char (**p);
int j;
p = a + 3;
for(j = 3; j >= 0; j--)
printf("%s\n", *(p--));
}

--答案是
Coble
dBase
C language
Pascal
--tip: * (p--)与* p--的效果一样,()改变不了++的特性,*(p--)还是先运行,后++。

11、指出下面代码的输出,并解释为什么。
int main()
{
int a[5] = {1, 2, 3, 4, 5};
int *ptr = (int *)(&a + 1);
printf("%d,%d", *(a + 1), *(ptr - 1));
}

--答案是:2,5 --原本&a+1的地址转移到了a[4]的下一个元素,然后被强转为4字节

12、以下程序段的执行结果是:_________
int *p=0;
p+=6;
printf(“%d”,p);

--答案是:24 //地址通常情况下是16进制,用10进制也可

13、以下程序段的执行结果是:_________
unsigned char *p1;
unsigned long *p2;
p1=(unsigned char *)0x10002011;
p2=(unsigned long *)0x10002021;
printf(“p1=%p,p2=%p”,p1+5,p2+4);

-- 答案是:p1=0x10002016, p2=0x10002041

14、以下程序段的执行结果为_______
int arr[] = {6, 7, 8, 9, 10};
int *ptr = arr;
*(ptr++) += 123;
printf(“ %d”, *ptr);
printf(“ %d”, *(++ptr));

--答案是:7 8 //加上括号也不能影响++的特性,

15、利用指针,对一个数组 a[10],输入相应的元素,并将这些元素输出到屏幕上

int main()
{

	int num[5]= {0};
	//输入
	printf("请输入5个数:\n");
	for(int i=0;i<5;i++)
	{
		scanf("%d",num+i);
	}
	
	//输出
	printf("5个数:\n");
	for(int i=0;i<5;i++)
	{
		printf("%d\n",*(num+i));
	}

	return 0;
}

16、利用指针 p 将一篇文章三行字符串,进行输入,并统计输入的大写小写,以及数字,空格,和其他字符的个数。

int main()
{
	char str[3][1024] = {0};
	char (*p)[1024] = str;
	
	
	//输入三行字符
	printf("请输入三行字符:\n");
	for(int i= 0; i<3;i++)
	{
		gets(p+i);
	}
	
	//统计
	int dz=0,xz=0,sz=0,kg=0,qt=0;
	for(int i=0;i<3;i++)
	{
		for(int j = 0;j<strlen(*(p+i));j++)
		{
			char ch = *(*(p+i)+j);
			if(ch >='A' && ch <='Z')
			{
				dz++;
			}
			else if(ch >='a' && ch <='z')
			{
				xz++;
			}
			else if(ch >='0' && ch <='9')
			{
				sz++;
			}
			else if(ch ==' ')
			{
				kg++;
			}
			else
			{
				qt++;
			}
		}
	}
	
	//打印
	printf("大写:%d\n",dz);
	printf("小写:%d\n",xz);
	printf("数字:%d\n",sz);
	printf("空格:%d\n",kg);
	printf("其他:%d\n",qt);

	return 0;
}

注:strlen这个函数的参数char *类型,是数组的首个元素的地址,原理是从首个地址开始,到'\0'结束。

17、仿写字符串函数功能:复制,比较,求长度,以及字符串连接。

#include <stdio.h>
#define N  4
/*
	作者: zcy
	日期:
	功能描述:仿写字符串函数功能:复制,比较,求长度,以及字符串连接
*/
int main()
{
	#if N==1
	//长度
	char ch[1024] = "hello";
	char *p = ch;
	int i=0; // 记录长度
	while(*p)
	{
		i++;
		p++;
	}
	printf("i=%d\n",i);
	
	
	
	
	#elif N==2
	//复制
	char dest[1024] = "hello";
	char src[1024] = "world!";
	char *p1 = dest;
	char *p2 = src;
	
	while(*p2)
	{
		*p1 = *p2;
		p1++;
		p2++;
	}
	*p1 = '\0';
	
	printf("dest = %s\n",dest);
	
	
	#elif N==3
	//拼接
	char dest[1024] = "hello";
	char src[1024] = "world!";
	char *p1 = dest;
	char *p2 = src;
	
	while(*p1)
	{
		p1++;
	}
	
	while(*p2)
	{
		*p1 = *p2;
		p1++;
		p2++;
	}
	*p1 = '\0';
	
	printf("dest = %s\n",dest);
	
	
	
	#elif N==4
	//比较
	char dest[1024] = "abcde";
	char src[1024] = "abcd";
	char *p1 = dest;
	char *p2 = src;
	int l1=0,l2=0;
	while(*p1)
	{
		l1++;
		p1++;
	}
	while(*p2)
	{
		l2++;
		p2++;
	}
	int l = l1>l2?l1:l2;
	int res = 0;
	p1 = dest;
	p2 = src;
	for(int i = 0;i<l;i++)
	{
		res = *(p1+i) - *(p2+i);
		if(res)
		{
			break;
		}
	}
	printf("res = %d\n",res);
	#endif

	return 0;
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动控制节水灌溉技术的高低代表着农业现代化的发展状况,灌溉系统自动化水平较低是制约我国高效农业发展的主要原因。本文就此问题研究了单片机控制的滴灌节水灌溉系统,该系统可对不同土壤的湿度进行监控,并按照作物对土壤湿度的要求进行适时、适量灌水,其核心是单片机和PC机构成的控制部分,主要对土壤湿度与灌水量之间的关系、灌溉控制技术及设备系统的硬件、软件编程各个部分进行了深入的研究。 单片机控制部分采用上下位机的形式。下位机硬件部分选用AT89C51单片机为核心,主要由土壤湿度传感器,信号处理电路,显示电路,输出控制电路,故障报警电路等组成,软件选用汇编语言编程。上位机选用586型以上PC机,通过MAX232芯片实现同下位机的电平转换功能,上下位机之间通过串行通信方式进行数据的双向传输,软件选用VB高级编程语言以建立友好的人机界面。系统主要具有以下功能:可在PC机提供的人机对话界面上设置作物要求的土壤湿度相关参数;单片机可将土壤湿度传感器检测到的土壤湿度模拟量转换成数字量,显示于LED显示器上,同时单片机可采用串行通信方式将此湿度值传输到PC机上;PC机通过其内设程序计算出所需的灌水量和灌水时间,且显示于界面上,并将有关的灌水信息反馈给单片机,若需灌水,则单片机系统启动鸣音报警,发出灌水信号,并经放大驱动设备,开启电磁阀进行倒计时定时灌水,若不需灌水,即PC机上显示的灌水量和灌水时间均为0,系统不进行灌水。
C语言指针数组是C语言中常用的数据结构之一,可以用于存储一组指针的地址。下面是一个经典C语言指针数组编程例题: 假设有一个学生成绩的数组,其中包含了5个学生的成绩。要求编写一个程序,输出成绩最高的学生的姓名和成绩。 首先,我们需要定义一个包含指针的数组,用来存储学生成绩的地址。假设学生成绩的数据类型为int,可以使用以下代码定义指针数组: int *scorePtr[5]; 接下来,我们需要输入学生的成绩,并将其存储到指针数组中。可以使用以下代码实现: int scores[5]; // 存储学生成绩的数组 for (int i = 0; i < 5; i++) { printf("请输入学生%d的成绩:", i+1); scanf("%d", &scores[i]); scorePtr[i] = &scores[i]; } 在上述代码中,我们通过scanf函数输入学生的成绩,并将成绩对应的地址存储到指针数组scorePtr中。 最后,我们需要找出成绩最高的学生,并输出其姓名和成绩。可以使用以下代码实现: int maxScore = *scorePtr[0]; // 假设第一个学生成绩最高 int maxIndex = 0; for (int i = 1; i < 5; i++) { if (*scorePtr[i] > maxScore) { maxScore = *scorePtr[i]; maxIndex = i; } } printf("成绩最高的学生是学生%d,成绩为:%d\n", maxIndex+1, maxScore); 在上述代码中,我们通过遍历指针数组scorePtr,比较每个学生的成绩,找出成绩最高的学生,并将其索引保存到maxIndex中。最后,我们通过maxIndex找到成绩最高的学生,并输出其姓名和成绩。 通过以上步骤,我们可以解决这个经典C语言指针数组编程例题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值