1.有关指针与数组的
a[i] 等价于 i[a]
因为对于数组来说,除了在sizeof()时,其他时候a相当于一个const指针,而所有对数组其他的操作都是基于a指针。
所以a[i]与i[a]一样都是a+i;
2.有关sizeof与strlen的
char b[2]={'a','b'};
那么 sizeof(b)=2;strlen(b)=x;因为这里似乎产生了溢出。
如果是 char b[20]={'a','b'};就没有这样的问题了,sizeof(b)=20*1=20,strlen(b)=2;
3.有关NULL与0
似乎有这么个说法,由0转换而来的指针绝对不能被解除应用。什么意思呢,就是说当0被赋予一个指针变量时,
绝对不能试图访问此指针指向的内存内容。
所以 strcmp(p,(char *)0);printf("%s",(char *)0);这样的语句是非法的。
这是c trap上讲的,但经过我的测试,似乎没什么问题,可能现在的编译器已经屏蔽了这个问题。
4.有关二维数组与指针的关系
涉及到函数指针或数组指针了,int calendar[12][31];可以定义一个指针指向该二维数组,你可以这样定义:int **p;
当然你也可以这样定义:int (*p)[31];但其实前者是错误的定义,显然前者指针的类型与实际不符合。
5.关于指针大小的问题
不论指针的类型是什么,指针本事的大小是固定的,具体是多少应该跟CPU有关系,即多少位机有关系,再具体点应该是跟
地址或数据总线有关系,32bit的应该是4B。
6.数组初始化列表的时候,末尾可以有多余的逗号。
不知道这是什么原因,按我的理解,逗号本事是不占内存的,它只是编译器用来区分数组内的元素的,比方说有一个数组
int a[10]={1,2,3,};编译器试图去了解这个数组有多少元素,1,然后碰到一个逗号,说明逗号前的这个1是其中的一个元素,
接着是2,然后同理,到最后一个逗号时,已经确定了3个元素,此时编译器继续往下寻找,但此时,后面已经没有其他的标识,所以
编译器理解为数据元素已经全部检查完毕,但此时如果又出现了一个逗号,即如果int a[10]={1,2,3,,};便会出现错误,因为它再一次
出现了一个逗号,本来逗号之前应该是数据元素的,但此时这个逗号之前还是逗号,所以这个逗号不应该出现在这里,同样,即使这个
逗号出现在1之前也是错误的。
姑且先这么猜着吧,估计肯定是错误的,要想彻底了解是怎么回事,可能还要看下编译原理的书。
7.关于返回值的一个说法。
struct A
{
int a;
char b;
}
main()
{
//...............
}
按书中所讲,似乎这个函数的返回值应该是struct A,这也可以理解,但我所用的编译器却似乎必须是int返回型,不知何解,
可能是便于OS接管,也可能是其他原因,这里不去深究。
8.关于字符串指针的问题。
char *p = "abcd";
char *q = p;
//q[1]='y';
printf("%s/n",q);
去掉注释后,编译通过,运行出现段错误。有2种解释,其一:ANSIC 禁止对string literal修改 其二:K&R C说对字符串常量的
修改行为是未定义的。不过仍然好像有编译器支持这种行为。
9.两个字符串合并的一个非常好的写法。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char *myStrcat(char *,char *);
int main()
{
char *s = "abcd";
char *t = "efgh";
char *r = myStrcat(s,t);
printf("%s/n",r);
free(r);
return 0;
}
char *myStrcat(char *s,char *t)
{
char *r;
r = malloc(strlen(s)+strlen(t)+1);
if(!r)
{
printf("malloc error!/n");
}
strcpy(r,s);
strcat(r,t);
return r;
}
10.先到这里吧,饿了,吃饭去。