C语言入门04——数组

1.数组的创建
1.一维数组
int arr[10];
double data1[20];
char ch[5];         //字符数组

int a =10;
int arr[a]; //这样的写法只能在支持C99标准的机器上(gcc),但是这种数组是不能初始化的

2.二维数组
int arr[10][2];  //先行后列
double data1[20][2];
char ch[5][3];

3.数组的类型
int arr[10];
sizeof(arr) 等价于 sizeof(int [10]) //这里[10]也是整个数组的类型一部分
2.数组的初始化
1.一维数组
int arr[10] = {1,2,3};  //不完全初始化,剩余的元素默认位0;
int arr2[10] = {1,2,3,4,5,6,7,8,9,10};
char ch[10] = {'s','d','g'};  // s d g 0 0 0 0 0 0 0  (3个元素)
char ch2[10] = "abc";        // a b c \n 0 0 0 0 0 0  (4个元素)  //要想以字符串打印,最后一位必须是'\n';

2.二维数组
int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
int arr[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; //二维数组的列不能省
int arr[][4] = {{1,2,3,4},{1,2}};  //这样也是可以的
注:对于字符数组初始化,逐个字符赋值(如果赋值的个数等于元素个数,最后不会补充\0)
        用字符串常量赋值(当赋值的个数等于元素个数的时候,不能用字符串常量赋值)

        0(整数0)和\0(ASCLL值为0)和NULL(宏定义也是0)是一码事

//字符串数组给指针赋值
char str[]  = "Hello World";
char * p = str;


char ch1[] = "hello";
char ch2[] = "hello";

char *p = ch1; 
char *p = ch2;
p指针保存的地址不一样,ch1和ch2是局部变量,在栈上

注:初始化字符指针是把内存中字符串的首地址赋予指针,并不把该字符串复制到指针。在C编程中,当一个字符指针指向一个字符串常量的时候,不能修改指针指向的对象的值。

字符串给指针赋值
char* p ="Hello World";
*p = 'h'; //错误,字符串常量不能修改。

"Hello World"在常量区,

3.数组数据的读取
1.一维数组
arr[i]读取

2.二维数组
用两层循环进行读取
for(i = 0;i<4;i++)//行循环
{
    for(j = 0 ;j <3; j++) //列循环
    {
             
    }
}
4.数组在内存这中的存储
一维数组变量的存放是连续的存放在内存空间中(从低地址到高地址)

二维数组变量的存储方式
把二维数组看成一行一维数组(一维数组的数组)
5.数组越界
越界,有时候数组是不会报错的


当是二维数组的时候,越界,也可能在数组范围内
6.数组的使用
int arr = {9,8,7,6,5,4,3,2,1,0};

//冒泡排序(两个相邻元素进行比较,然后交换顺序)
void bubble_sort(int arr[],int index+);
void bubble_sort(int *arr,int index);
{
    for(int i = 0 ;i< sizeof(arr)/sizeof(arr[0])-1;i++)
    {
        //错误示范,坚决不能在函数内部求数组元素个数
        for(int j = 0 ;j < sizeof(arr)/sizeof(arr[0])-1 - i;j++)
        {
            if(arr[j] > arr[j+1])
            {
                int t = arr[j + 1];
                int arr[j+1] = arr[j];
                arr[j]  = t;            
            }        
        }    
    }
}
7.数组名是是什么?
1.一维数组名确实表示数组首元素的地址但有有两个例外
1.sizeof(数组名);//计算的是整个数组的长度大小,单位是字节
2.&数组名,也表示取出整个数组的地址


printf("%p\n",arr);      //数组首元素地址    
printf("%p\n",arr+1);    //数组第二个元素的地址

printf("%p\n",&arr[0]);  //数组首元素地址
printf("%p\n",&arr[0]+1);//数组第二个元素的地址

printf("%p\n",&arr);     //数组首元素地址
printf("%p\n",&arr+1);   //整个数组地址往后加arr类型字节的地址


2.二维数组的数组名的理解
int arr[3][4];
sizeof(arr) 为 48;

arr;//二维数组的数组名也表示数组首元素的地址
arr+1;//表示二维数组第二行元素的首地址
sizeof(arr)/sizeof(arr[0]); //数组整个长度除以第一行元素的长度得到数组的行数
sizeof(arr[0 ])/sizeof(arr[0][0])数组整行的长度除以第一个元素的长度得到数组的列数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值