C陷阱与缺陷学习(第3章)

1. char a[10] = { };   *(a+i) 与 a[i]等同。

    由于a+i 与 i+a含义一样,因此 a[i] 与 i[a] 也有同样含义。

int main()
{
char data[3] = {1,4,8};

printf("%d  %d\n",2[data],data[2]);

return 0;

}//输出为:8  8 

2. int* ap; ap是指向整形的指针,

    int   ap[10]; ap是一个拥有10个整形元素的数组,

    int  *ap[31]; *ap是一个拥有31个整形元素的数组,所以ap是指向这样数组的指针。

3. 非数组指针

    字符串常量代表一块包括字符串中所有字符以及一个空字符('\0')的内存区域的地址

    strlen返回参数不包括结束符'\0',所以一个字符串如果strlen申请空间strcy后,%s打印字符串会挂掉。

4. 空指针并非空字符串

            常数0可以给用作给指针赋值,与NULL作用一样。这种情况(指针为空的情况),只能对指针本身操作,

     不能企图使用该指针所指向的内存中存储的内容。

      if(p == (char*)0)   正确;

      if( strcmp( p, (char*)0 ) )   错误,strcmp实现会查看指针指向的内容;

      同理,char*p = (char*)0;  printf("%s",p);  也是错误的。

5.  数组中实际不存在的“溢界”元素的地址位于数组所占内存之后,这个地址可以用于进行赋值和比较。

     int a[N] = { };

     a[N]不存在,但是&a[N]存在。







发布了9 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sssuperqiqi/article/details/79567274