【数组指针/指针数组】字符数组/字符串数组

数组;
数组的类型 由

  • 元素的类型
  • 数量
    数组的定义决定了数组的类型,元素个数以及元素类型。
    语法结构: 类型 数组名 [元素个数]
    int Arr [10]
    元素的个数必须是整型常量,且必须 >0 .
    数组的大小是在编译期确定的,编译系统按照定义为数组分配一段连续的存储单元。(且大小不可改变,所以不可以定义为变量,但C99标准可以)
    计算数组大小:sizeof(ar)/sizeof(ar[0]);//数组大小除以元素类型的大小。才是数组的大小。
    仍然占一个字节,但是strlen()`计算出来的是字符串长度,不包括。
    char str[10] = {‘a’,‘b’,‘c’,‘d’,‘e’} 0的ascll码值和\0相同。因此 被视为字符串。
    请添加图片描述
字符串:凡是由'\0'结尾均为字符串
字符数组:凡是么有'\0'结尾均为字符数组。
当len = strlen(strd), 
1char strd[] = {'a','b','c','d','e'} 值为5
2char strd[] = {'a','b','c','d','e''f','g','h'}15
明显错误,是因为它在计算的时候在寻找'\0',因此越界超出,而1式知识运气比较好罢了,刚好等于5 

请添加图片描述

不要再提字符数组的概念!!跳到字符串数组就要想到后面由\0 不能计算其长度,只能计算其大小。

  • 数组名是指针,但是却丢失了数组另一个要素:数组的大小,及数组元素的数量。编译器按数组定义时的大小分配内存,但运行时对数组的边界不加检测,这会带来无法预测的错误。
    int ar[] = {1,2,3,4,5,6}
    ar 代表数组首元素的地址
    *ar *(ar+1) *(ar+3)···· (ar+i)
    i[ar] 和 ar[]相等, 都会转化为指针
    为什么

    数组作为函数的参数会退化为指针呢:我们将从时间效率和空间效率分析。
void print_Ar(int br[10]);
void print_Ar(int br[]);
void Printf(int *br , int n);

我们先假设数组作为函数的形参,我们分析一下调用过程;
在传递过程中我们不仅要把数组名传递给形参,还要把数组个数传递给形参

   int main()
           {
              int arr[10] ;
                  数组名arr 未初始化也就是为赋值,没有存储数据。
              int brr[3] = {11,22,22};
              brr 已经初始化
              return 0}
              
  • 数组指针int *ar[5] 5个元素类型为整型指针的数组
    a = 1,b =2,c=3,d = 4;
    int ar[5] = {a,b,c,d}
    int *ar[5] = {&a,&b,&c,&d} //未定义的部分为 0,每个空间是整型指针类型,存放a,b,c,d的地址
    如下图:
    请添加图片描述

请添加图片描述
&ar:整个数组的地址
如果有int ar1[4],intar2[4],int ar3[4];
&ar1+1在地址空间上就指向&ar2
ar :数组首元素的地址
指向同一个值,但是意义不同。
请添加图片描述

  • 指针数组int (*pa)[4]; pa是一个指针变量,(能够存放元素个数为5,元素类型为整型类型)的数组的地址
    如:int (*pa)[4] = &ar1; 表示的是 pa指向了元素个数为4,类型为整型的数组。(限定了存放的数组的元素个数)
    pa = &ar1; pa:就代表整个数组的地址
    pa+1:即等于直接加到下一片空间。
    *pa = *&ar1=ar1 :就表示数组首元素的地址
    *pa+1 :表示 从ar[0] -> ar[1];

请添加图片描述

**int *s 和 int (pa)[4]的区别?

s+1 只加了一个整型,4字节
pa+1是加了一个数组 16字节(指向数组的指针)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值