(详)数组的定义初始化、面向数组的指针使用以及各类问题(随时更新)


前言

       无论是数组还是字符串,使用它们的过程中不可避免的要是用到C语言的灵魂功能指针,研究各类数组时面对的更多的是对指针的正确操控,这篇文章将分享在学习c语言过程中不断出现的数组问题,如有纰漏评论区留言。

一、数组是什么?

       数组(Array)是大部分编程语言都会提供的一种有序的元素序列。功能是将有限的类型相同的变量统一集合并且命名,那么这个名称为数组名。组成数组的各个变量都是数组的元素,或称为下表变量。

 (2021/7/10号更新)

        值得注意的是数组名可以认为是数组首地址,类型为常量指针。在二维数组中函数名成为了这个二维数组中第一个一维数组的地址arr==&arr[0].

        事实上在二维数组中

        arr的值可以等值于 arr[0]   &arr[o]  &arr[0][0]

        arr+2的值可以等值于 &arr[2] arr[2] &arr[2][0]

二、数组的定义和初始化以及问题

1.数组的定义和初始化

     一维数组定义 初始化

//如果下标运算符有数据

    基本数据类型通用

1.   type_name arr[6];    //元素有6个  系统随机分配的垃圾值(就算是bool类型)   数组长度为6.

2.   type_name arr[5]={};    //元素有5个 元素全部为0                    数组长度为5.

     int类型(float double long同理)

1.  int arr[3]={1,2,3};   //元素有3个                                         数组长度为3 .

2.  int arr[4]={1,2,3};   //元素有4个 arr[3]未被赋值默认为0    数组长度为4.

    char类型

1.  char arr[3]={"hi"};     //元素有3个  'h'  'i'  '\0' ('\0'作为结束符自动补上)      数组长度为3.

2.  char arr[3]="dog";    //元素有3个 'd' 'o' 'g' 由于数组长度限制'\0'无法补上 数组长度为3.

3.  char arr[6]={'H','E','L','L','O'};     //元素有6个  'H','E','L','L','O','\0'      数组长度为6.       

     //以上三种三种赋值运算符右边的写法都是允许切自动补'\0'  **

       值得注意的是  “Hello” 可以被 "Hel""lo"代替                         **


//如果下标运算符无数据

       基本数据类型通用

1.   type_name arr[]={};       //会有一个元素 如果去掉 ={} 则会报错

       int类型(float double long同理)

1.  int arr[]={1,2,3};              //元素有3个      1,2,3                                   数组长度为3 .

       char类型

1.  char arr[]={"HI"};           //元素有3个  'H'  'I'  '\0' ('\0'作为结束符自动补上)      数组长度为3

2.  char arr[]={'H','E','L','L','O'};   //元素有6个              'H','E','L','L','O','\0'            数组长度为6

    二维数组定义 初始化

//    一般而言arr[A][B]中,A代表行,B代表列  A可以为空但是B一定要有值 并要赋值或={}

//如果两个下标运算符中都有数据

    基本数据类型通用

1.   type_name arr[3][3];    //元素有9个  系统随机分配的垃圾值(就算是bool类型)   数组行数为3列数为3.

2.   type_name arr[5][5]={};    //元素有25个 元素全部为0                    数组行数为5.

    int类型(float double long同理)

1.  int arr[3][3]={1,2,3};   //元素有9个  arr[0][0]到arr[0][2]分别存储1,2,3其余元素都是0  数组长度为3 .

2.  int arr[3][3]={{1,2},{3,4},{5,6}}; 

 //元素有9个 

//arr[0][0]存储1     arr[0][1]存储2   arr[0][2]存储0   

//arr[1][0]存储3     arr[1][1]存储4   arr[1][2]存储0

//arr[2][0]存储5     arr[2][1]存储6   arr[2][2]存储0   (\0本质就是0)

    char类型

1.  char arr[3][3]={"who","am","i"};          //{}中的单个字符串不能比列宽长

//arr[0][0]存储'w'  arr[0][1]存储'h'  arr[0][2]存储'o

//arr[1][0]存储'a'  arr[1][1]存储'm'  arr[1][2]存储'\0'

//arr[2][0]存储'i'   arr[2][1]存储'\0'  arr[2][2]存储0   (\0的ascll码就是0)

//值得注意的是由于printf(%s,arr)输出是到\0截止,而二维数组两个相邻的元素的地址也是相邻的即arr[0][2]的地址和arr[1][0]的地址也是相邻,如果使用printf("%s",arr[N]); 0<=N<=2  如N=0 则会输出whoam.

2.  char arr[3][3]="whoami";                  //错误 "whoami"作为字面值字符串无法放入二维数组 

3.  char arr[3][3]={'H','E','L','L','O'};     

//arr[0][0]存储'H'  arr[0][1]存储'E'  arr[0][2]存储'L' 

//arr[1][0]存储'L'  arr[1][1]存储'O'  arr[1][2]存储'\0'   (\0的ascll码就是0)


//如果两个下标运算符中都有数据

    基本数据类型通用

1.   type_name arr[][3];    //编译不通过 缺少二维数组行数

2.   type_name arr[][5]={};    //元素有5个 全部为垃圾值       数组行数为1.

3.   type_name arr[][]={};      //编译不通过 没有元素列宽 

    int类型(float double long同理)

1.   int arr[][3]={1,2,3,4};   //元素有6个 如果一行中的元素超过3行数会加一继续写入

//arr[0][0]存储1  arr[0][1]存储2  arr[0][2]存储3 

//arr[1][0]存储4  arr[1][1]存储0  arr[1][2]存储0

2.  int arr[][3]={{1,2},{},{1,3}};

//arr[0][0]存储1  arr[0][1]存储2  arr[0][2]存储0

//arr[1][0]存储0  arr[1][1]存储0  arr[1][2]存储0

//arr[2][0]存储1  arr[2][1]存储3  arr[2][2]存储0   (\0的ascll码就是0)

    

     char类型

1.  char arr[][3]={"who","","i"};          //{}中的单个字符串不能比列宽长

//arr[0][0]存储'w'  arr[0][1]存储'h'  arr[0][2]存储'o

//arr[1][0]存储'\0'  arr[1][1]存储'\0'  arr[1][2]存储'\0'

//arr[2][0]存储'i'   arr[2][1]存储'\0'  arr[2][2]存储'\0'   (\0的ascll码就是0)

2.  char arr[][3]="whoami";                  //错误 同上

3.  char arr[][3]={'H','E','L','L','O'};     

//arr[0][0]存储'H'  arr[0][1]存储'E'  arr[0][2]存储'L' 

//arr[1][0]存储'L'  arr[1][1]存储'O'  arr[1][2]存储'\0'

2.对数组的指针使用

    基本数据类型通用

1.Type_Name arr[10];

    Type_Name * p = arr;  //数组要被同一类型的指针存储

    void * p = arr;              //万能指针可以存储各类数组头地址

                                          // printf("%?",*(Type_Name *)p);   ** %?需要和Type_Name对应**

  Type_Name arr[5][10];

      Type_Name (* pa)[10]=&(&arr[1])[0];

      Type_Name (* pa)[10]=arr+1;

      Type_Name (* pa)[10]=&arr[1];

     //由于数组指针只能指向一个数组宽度为10的数组的指针

3.存储在全局数据区的数组们遇到的问题

    //全局数组的定义   linux gcc编译器
#include<stdio.h>
#define N 10
const n=10

int arr1[N];    //编译通过
int arr2[n];    //编译错误  存储在静态全局区的数组在定义时 元素长度必须是常量 不能是变量或只读变量 (C++会允许)

int main()
{
        //如果下标运算符内有内容
    int arr2[N];    //编译通过
    int arr3[n];    //编译通过
    static int arr4[n];     //编译错误 静态数组也存储在静态全局区 (C++会允许)
    return 0;

}

总结

2021/5/31日更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值