指针经典例题
1、
-- 答案是 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;
}