码迷,mamicode.com
首页 > 其他好文 > 详细

数组的指针特性

时间:2014-06-15 19:19:52      阅读:221      评论:0      收藏:0      [点我收藏+]

标签:style   class   code   http   tar   ext   

从一道小题下手(该考点曾被腾讯等大公司作为基础笔试题考过),

#include <stdio.h>

int size(char a[10])
{
    return sizeof(a);
}

int main(void)
{
    char a[] = {‘C‘,‘h‘,‘i‘,‘n‘,‘a‘,‘\0‘};
    char *p = "China";
    char *q = a;

    printf("sizeof(a)=%d\n", sizeof(a));
    printf("sizeof(p)=%d\n", sizeof(p));
    printf("sizeof(q)=%d\n", sizeof(q));
    printf("size(a)=%d\n", size(a));

    return 0;
}

在32位机的编译环境下,对C语言很熟悉的人一眼就能看出结果为:

sizeof(a)=6
sizeof(p)=4
sizeof(q)=4
size(a)=4

基于本小题,主要考究以下几点:

数组名退化成指针

仅在以下3种情况中,数组不会退化成指针,

  1. 使用sizeof(a)的时候,所以上面sizeof(a)的结果为6字节

  2. 对数组名取地址操作:&a。&a的类型为pointer to array of 6 chars,而对字符串指针取地址结果为pointer to pointer to char.

  3. 使用字符串初始化数组的时候也不会退化。

其它情况都会退化成“指向数组首元素的指针”,比如:

  1. 数组名做函数参数时,a都会退化成&a[0]指针。如上面的size函数和printf函数中的a[]都是这种情况

  2. 二维数组,char s[10][8]数组的首元素(得理解这个首元素,从一维数组的角度看的)是一维数组s[0],因此退化成&s[0]指针

数组定义字符串和指针定义字符串的区别

  1. 使用数字定义的字符串只分配字符串所需的空间(上例中为6个字节),数字名没有单独的存储空间;使用指针定义字符串,除了字符串占用的空间,还要为指针变量分配对应的空间。

  2. 数组退化成指针为“常量指针”,不可更改,而直接指向字符串的指针可修改,如

    char a[10] = "China";
    char *p = "China";
    a++;   // 错误的
    p++;   // 正确的

数组的指针特性,布布扣,bubuko.com

数组的指针特性

标签:style   class   code   http   tar   ext   

原文地址:http://blog.csdn.net/xiahouzuoxin/article/details/30462925

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!