数组的指针特性

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

#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

时间: 2024-10-23 16:22:07

数组的指针特性的相关文章

数组与指针操作

一,数组 1,const int array[5] = {0, 1, 2, 3, 4}; 2,c99新特性,可以对指定的数组的某一个元素初始化.例如:int array[10] = {1, 3, [4] = 2, 6, 7, [1] = 32};如果多次对一个元素进行初始化,取最后一次的值. 3,c不支持把数组作为一个整体来赋值,也不支持用花括号括起来的列表形式进行赋值. 4,sizeof表达式被认为是一个整数常量. 5 * 5 - 1 就是整数常量表达式. 5,变长数组int array[n]

数组与指针的本质

指针是C/C++语言的特色,而数组名与指针有太多的相似,甚至很多时候,数组名可以作为指针使用.于是乎,很多程序设计者就被搞糊涂了.而许多的大学老师,他们在C语言的教学过程中也错误得给学生讲解:"数组名就是指针".很幸运,我的大学老师就是其中之一.时至今日,我日复一日地进行着C/C++项目的开发,而身边还一直充满这样的程序员,他们保留着"数组名就是指针"的误解. 想必这种误解的根源在于国内某著名的C程序设计教程.如果这篇文章能够纠正许多中国程序员对数组名和指针的误解,

C++primer第四章 数组和指针

4.1. 数组 数组是由类型名.标识符和维数组成的复合数据类型(第 2.5 节),类型名规定了存放在数组中的元素的类型,而维数则指定数组中包含的元素个数. 数组定义中的类型名可以是内置数据类型或类类型:除引用之外,数组元素的类型还可以是任意的复合类型.没有所有元素都是引用的数组. 4.1.1. 数组的定义和初始化 数组的维数必须用值大于等于 1 的常量表达式定义(第 2.7 节). 此常量表达式只能包含整型字面值常量.枚举常量(第 2.7 节)或者用常量表达式初始化的整型 const 对象. /

C语言学习_数组与指针2

数组其实是一种变相的指针,数组名同时也是指针,eg: CODE == &CODE[0]; 数组的加法: #include<stdio.h> #define SIZE 4 int main(void) { shortdates[SIZE]; short* pti; shortindex; doublebills[SIZE]; double* ptf; pti= dates;//把数组地址付给指针 ptf= bills; printf("%23s  %10s\n", &

基于arm的C++反汇编 数组和指针的寻址

数组在函数内 数组作为参数 数组作为返回值 下标寻址和指针寻址 下标值为整型常量的寻址 下标值为整型变量的寻址 下标值为整型表达式的寻址 数组越界 多维数组 存放指针类型数据的数组 指向数组的指针变量 函数指针 ??虽然数组和指针都是针对地址操作,但它们有许多不同之处.数组是相同数据类型的数 据集合,以线性方式连续存储在内存中:而指针只是一个保存地址值的4字节变量.在使用中,数组名是一个地址常量值,保存数组首元素地址不可修改,只能以此为基地址访问内 存数据:而指针却是一个变量,只要修改指针中所保

C语言 二维数组(指针)动态分配和释放(转)

C 二维数组(指针)动态分配和释放 先明确下概念: 所谓32位处理器就是一次只能处理32位,也就是4个字节的数据,而64位处理器一次就能处理64位,即8个字节的数据.如果我们将总长128位的指令分别按照16位.32位.64位为单位进行编辑的话:旧的16位处理器,比如Intel 80286 CPU需要8个指令,32位的处理器需要4个指令,而64位处理器则只要两个指令,显然,在工作频率相同的情况下,64位处理器的处理速度会比16位.32位的更快.而且除了运算能力之外,与32位处理器相比,64位处理器

数组与指针的区别?

数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.指针可以随时指向任意类型的内存块.    (1)修改内容上的差别 char a[] = "hello";  //它们有各自的内存空间:a[0] = 'X';char *p = "world"; // 注意p 指向常量字符串p[0] = 'X'; // 编译器不能发现该错误,运行时错误 (2) 用运算符sizeof 可以计算出数组的容量(字节数).sizeof(p),p 为指针得到的是一个 指针变量的字节数,

数组与指针

//使用递归来计算阶乘#include<stdio.h>long rfact(int n);int main(){ int num; printf("This program calculate factorials.\n"); printf("Enter a value in the range 0-12(q to quit): \n"); while(scanf("%d",&num)==1) { if(num <0

(C/C++)区别:数组与指针,指针与引用

1.数组跟指针的区别 数组要么在静态存储区被创建(如全局数组),要么在栈上被创建.数组名对应着(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改变. 指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来操作动态内存.指针远比数组灵活,但也更危险. 数组和指针特点的简单比较: 数组 指针 保存数据 保存地址 直接访问数据 间接访问数据,先取得指针的内容,然后以它为地址取得数据 用于存储数目固定且类型相同的数据 通常用于动态数据结构 编译器自动分配和删除