1、先来思考一道题:(认真思考昂😶😶)
(单选题)有以下程序段:
main(){int a=5,*b,**c;c=&b;b=&a;…}
程序在执行了c=&b;b=&a;语句后,表达式**c的值是( )。
A)变量a的地址 B)变量b中的值
C)变量a中的值 D)变量b的地址
答案选:C
笔记:
二级指针c的内存单元里放的是一级指针b的地址,而b里面又放的是变量a的地址。
*c就等价于指针变量b,**c就等价于*b,而*b就是变量a,所以**c的值就是变量a的值!!!
2、这一道简单一点但还是看一下!
有以下程序变量b中的值
#include <stdio.h>
#include <string.h>
int main()
{
char str[ ][20]= {"Hello","Beijing"},*p=str[0];
printf("%d\n",strlen(p+20));
return 0;
}
程序运行后的输出结果是_______
答案:7
笔记:
1.strlen(p+20)代表str[1]
2.strlen函数不计算反斜杠0
3、题目:
#include <stdio.h>
int main()
{ int p[7]= {11,13,14,15,16,17,18},i=0,k=0;
while(i<7&&*(p+i)%2) {
k=k+*(p+i);
i++; }
printf("%d\n",k);
return 0;
}
程序运行后的输出结果是___________
答案:24
笔记:
1.*(p+i)%2结果为0时循环结束
所以只有前两个计入了k;
不要把循环理解成:(好吧,好像是羊自己)
for(int i=0;i<7;i++)
if(i<7&&*(p+i)%2)
{
k=k+*(p+i);
}
4、题目:
#include <stdio.h>
int main()
{ char a,b,c,*d;
a='\';
b='\xbc';
c='\0xab';
d="\0127";
printf("%c %c %c %c \n",a,b,c,*d);
return 0;}
编译时出现错误,以下叙述中正确的是_______
A、程序中只有a='\';语句不正确
B、 b='\xbc';语句不正确
C、d="\0127";语句不正确
D、a='\';和 c='\0xab';语句都不正确
答案:D
笔记:
1、因为单个\是转义字符,如果你要输入\的话,应该是a='\\'
2、d="\0127";反斜杠0代表结束,所以后边已经不能输入了
3、b='\xbc';因为\x代表16进制,所以\xbc代表一个16进制数字
5、题目
#include<stdio.h>
int main()
{
int x[8]={8,7,6,5}, *s;
s=x+3;
printf("%d\n",s[1]);
return 0;
}
执行后输出结果是________
答案: 0
题解:
你看昂 这个数组 s是指针 然后s是x+3 x是数组名 那么也就是首地址 +3就是 x[3]的地址 所以也就是5的地址 然后输出是不是s1 也就是第二个 也就是说 从下标为3开始 数 0 1那么x4就是s1的地址 数组赋初值 是不是没有赋值的默认都为0 所以 答案为0
6、 题目
以下函数的功能是:通过键盘输入数据,为数组中的所有元素赋值。
#define N 10
void arrin(int x[N])
{
int i=0;
while(i<N)
scanf("%d",_________);
}
在下划线处应填入的是_________
A、x+i
B、&x[i+1]
C、 x+(i++)
D、 &x[++i]
答案:C
题解:
A、x+i ,i一直没有变
B、&x[i+1] ,没有给x[0]赋值
D、 &x[++i] ,++i优先级较高先进行+1操作,所以没有给x[0]赋值
6、题目:
int main()
{
char *s="\n123\\";
printf("%d,%d\n",strlen(s),sizeof(s));
return 0;
}
执行后输出结果是_________
答案: 5,8
笔记:
每种类型的字节大小:
7、题目:
若有定义int *p1,*p2; 则错误的表达式是( )。
A、p1+p2
B、p1-p2
C、p1<p2
D、p1=p2
答案:A
题解:
A、p1+p2--语法错误
B、p1-p2 --指他们俩个中间的距离
C、p1<p2--地址比较
D、p1=p2--把p2的地址赋给p1
笔记:
展开说一下上面的A选项昂:
两个指针是不能相加的。仍以街道地址的比喻为例,假设羊住在湖滨大道1332号,羊的邻居住在湖滨大道1364号,那么1332+1364指的是什么呢?其结果是一个毫无意义的数字。如果你的C程序试图将两个指针相加,编译程序就会发出警告。
8、一个很奇怪的题目
有以下语句: int a[5]={0,1,2,3,4},i; int *p=a; 设0≤i<5,对a数组元素不正确的引用是( )。
A、*(&a[i])
B、a[p-a]
C、*(*(a+i))
D、p[i]
答案:C
题解:
A、*(&a[i]) ---a地址和取值号(*)抵消了
B、a[p-a]---p-a就是0,上一个题目才说的 指针可以剪 就是距离,p-a就是a-a,那就是0
C、*(*(a+i)) ---**是二级指针了
D、p[i] ---和A一样(师傅说的)
9、题目:
fun(char *sl,char *s2)
{
int i=0;
while(sl[i]==s2[i]&&s2[i]!='\0') i++;
return(sl[i]=='\0'&&s2[i]=='\0');
}
此函数的功能是_________
- A. 将s2所指字符串赋给s1
- B. 比较s1和s2所指字符串的大小,若s1比s2的大,函数值为1,否则函数值为0
- C. 比较s1和s2所指字符串是否相等,若相等,函数值为1,否则函数值为0
- D. 比较s1和s2所指字符串的长度,若s1比s2的长,函数值为1,否则函数值为0
答案:C
题解:
1、 while(sl[i]==s2[i]&&s2[i]!='\0') i++;此循环语句的意义是将s1与s2的每一个数组元素进行比较,直到s2中的元素比较完,循环结束;
2、 return(sl[i]=='\0'&&s2[i]=='\0');如果s1和s2的所有数组元素都相等,(即循环进行到了最后一项)表明他们相等,返回的函数值为1,否则函数值为0
10、题目:
若有以下定义和语句:________
int s[4][5],(*ps)[5];
ps=s;
则对s数组元素的正确引用形式是
- A. ps+1
- B. *(ps+3)
- C. ps[0][2]
- D. *(ps+1)+3
答案:C
笔记:
1、指针类型(以int为例):
int* a;//a是指向整形的指针;
int* a[5];//一维指针数组(这里存放着5个指向整形的指针),a指向第一个元素的地址,a+1指向第二个......(a[5]是一个指针数组);
int (*a)[5];//指向数组(这里每个一维数组含5个元素)的指针,a是第一个一维数组的首元素地址,a+1指向第二个一维数组的首元素地址......(a是数组指针);
int (*a)();//a是指向函数的指针(函数指针);
int *a();//函数的返回类型是int *,a只是一个函数名;2、int (*a)[5](int *p 和int a[] 这个是等价的,所以 int(*p)[]等价于 二维数组)
该数组元素的正确引用形式:(以第一行第3个元素为例)
(1)ps[0][2]
(2)*(*(p+0)+2)
11、题目:
设int x[] ={1,2,3,4,5,6,7,8,9,10},*p=x; ,则值为3的表达式是______
- A. p+=2, *p++
- B. p+=2, *++p
- C. p+=2, p++
- D. p+=2, ++*p
答案:B
笔记:
考点是优先级;(可以去看羊转载的优先级图表文章)
12、题目
设有int a[ ]={0,1,2,3,4,5,6,7,8,9},*p=a; ,且0≤i<10,则对数组元素地址的正确表示是( )
- A. &(a+1)
- B. a++
- C. &p
- D. &p[i]
答案:D
题解:
- A. &(a+1)--这个的话,直接报错了,不能这么写。如果是用a来表示元素的地址,是&a[1]才比较合理
- B. a++--这个是自增嘛,更不对了的(他底层是把他作为一个常量地址,不能改变,所以就不能++了)
- C. &p--&p相当于就是指向a的起点地址
- D. &p[i]--&p[i]的话,等同于&a[i]