第五次作业
笔记:
程序运行结果:
出现问题:
一级指针和二级指针的关系:
1.一级指针指向的内容一定是一个“地址”,而不是普通变量。一级指针本身p本身也是一个变量,它跟 a 是 一样的,只不过指向的内容不同而已,a指向的是一个具体的值,而p则是指向a的内存地址。
2.对p的赋值和各种其他操作(不带*),都是伴随着“内存地址”的。
3.二级指针也是一个变量,它指向的一定是“指针的地址”。对比下,一级指针指向的是普通变量的地址,二级指针指向的是“一级指针的地址”,以此类推,三级指针对应的是“二级指针的地址”。不管是普通变量,一级指针、二级指针…多级指针,都是普通变量,指针只有在定义的时候,才会带*,有几个*代表就是几级指针,我们在对这个指针进行赋值的时候, 不需要带*,不管是一级还是多级,一律将所有*去掉。
PTA问题(1):
指针数组和数组指针的区别:
数组指针(行指针)
定义 int (*p)[n];
()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
所以数组指针也称指向一维数组的指针,也称行指针。
指针数组
定义 int *p[n];
[]优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。
如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针
for(i=0;i<3;i++)
p[i]=a[i]
这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]
所以要分别赋值。
这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
优先级:()>[]>*
PTA问题(2):
函数题第二题编译错误的原因:
程序执行时,首先计算表达式的值,与case后面的常量表达式值比较,若相等就执行对应部分的语句块,执行完后利用break语句跳出switch分支语句。若表达式的值与所有的case后的常量表达式均不匹配,则执行default项对应的语句n,执行后跳出switch分支语句。case后面的常量表达式只能是整型、字符型或枚举型常量的一种;各case语句表达式的值各不相同,只起到一个标号作用,用于引导程序找到对应入口。
PTA函数题(6-4 )字符串的连接的三种方法
第一种方法:

char *str_cat( char *s, char *t ){
char *ps=s;
while(*s!='\0'){
s++;
}
while(*t!='\0'){
*s=*t;
s++;
t++;
}
*s='\0';
return ps;
}
第三种方法:
char *str_cat( char *s, char *t ){
int i,j;
for(i=0;i<=strlen(s);i++){
if(s[i]=='\0'){
for(j=0;j<strlen(t);j++,i++){
s[i]=t[j];
}
s[i]='\0';
}
}
return s;
}