黑马程序员—C语言—数组、字符串、结构体和枚举

————————Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———————

一、数组

1.数组的定义格式:

类型      数组名[元素个数];

例如:

int ages[5] = {19, 19, 28, 27, 26};
还有其他写法:

int ages[5] = {19, 19};
int ages[5] = {[3] = 27, [4] = 26};
int ages[] = {19, 19, 28, 27, 26};
这些写法都是正确的。

不过,

int ages[];
这样写是错误的,又没有数组元素的个数,又没有赋值。

特别提醒:

int ages[5];
ages = {10, 11, 12, 14};
上面这种写法是错误的。只能在定义数组的同时进行初始化。

之前我们已经提到数组作为函数参数,传递的是整个数组的地址,修改函数形参数组元素的值,会影响到外面的实参数组。

例如:设计一个函数,找出整型数组元素的最大值

#include <stdio.h>

int maxOfArray(int array[], int n)
{
//定义一个变量存储最大值(默认就是首元素)
    int max = array[0];
//遍历所有元素,找出最大值
    for (int i = 1; i < n; i++)
    {
//如果当前元素大于max,就用当前元素覆盖max
        if(array[i] > max)
        {
            max = array[i];
        }
        
    }return max;
}
int main()
{
    int a[] = {12, 15, 50, 23, 43, 5, 53};
    int max = maxOfArray(a, (sizeof(a)/sizeof(int)));
    printf("%d", max);
   
    return 0;
}

上面的maxOfArray函数传递的形参是数组元素,是地址传递,因此可以改变main函数中数组a内部的值。

2.多维数组

有的时候采用单一的数组也可能满足不了需求,这时候就需要用到多维数组,他的定义和普通的数组完全一样,只不过他的每一个元素本身都是一个数组。我们来看一下多维数组的存储方式:
int a[2][2]={{0,1},{2,3}};  
printf("a[0][0]: %p \n", &a[0][0]);  
printf("a[0][1]: %p \n", &a[0][1]);  
printf("a[1][0]: %p \n", &a[1][0]);  
printf("a[1][1]: %p \n", &a[1][1]);
输出结果为
a[0][0]: 0x7fff5fbff8c0   
a[0][1]: 0x7fff5fbff8c4   
a[1][0]: 0x7fff5fbff8c8   
a[1][1]: 0x7fff5fbff8cc 
由此可以看出,多维数组的存储方式和一维数组的存储方式是完全相同的。

二、字符串
直接上例子:
int main()
{
      char name[] = "it";
      char name2[] = {'o', 'k'};
      printf("%s\n", name2);
      return 0;
}
该程序输出为
okit
注:printf直至输出到'\0'为止。
如果printf改为
printf("%s\n", &name2[1]);
输出则为
kit
如果将程序改为
char name[] = "Hell\0oWorld";
char name2[] = {'o', 'k'};
printf("%s\n", name2);
return 0;
输出结果则为
okHell
总结:在字符串的printf输出中,要结合内存,一旦遇到'\0'就终止输出。

三、结构体
首先类比一下数组
数组是由多个相同类型的数据构成的。
而结构体呢,是可以有多个不同类型的数据所构成的。
1.定义结构体的基本格式:
//定义结构体类型
Struct Person
{
      //里面有3个变量,称为结构体的成员或属性
      int age; //年龄
      double height; //身高
      char *name; //姓名
}; //分号不能忘记
//根据结构体类型,定义结构体变量
Struct Person p = {25, 180, "Jack"};
//更改p对象中的变量
p.age = 30;
p.name = "Rose";
错误示范:
Struct Person p2;
p2 = {30, 1.75, "Tom"};
与之前说的数组是一样的道理,只能在定义变量时一起初始化。
2.结构体内存分析
Struct Student
{
      int age; //int是4个字节
      char *name; //char *是8个字节
};
Struct Student stu;
stu.age = 25;
stu.name = "Jack";
//求stu所占的空间大小
int s = sizeof(stu);
printf("%d", s);
输出结果为
16
为什么呢?4+8 = 12才对啊。
其实不然,结构体内存中会有一个补齐算法。
补齐算法:也就是说结构体所占用的存储空间,必须是最大成员字节数的倍数。
因此我们知道成员中最大字节数为8,所以存储空间的大小应该为8*2 = 16才对!
3.结构体变量多种定义方式
一般有3种方式:
1)先定义类型,再定义变量(分开定义)
Struct Student
{
      int age;
};
Struct Student stu;
2)定义类型的同时定义变量
Struct Student
{
      int age;
}stu;
Struct Student stu2;
上面程序做了两件事:1.定义一个结构体变量。2.给结构体变量起了一个名字叫stu。
3)定义类型的同时定义变量(省略了类型名称)
struct
{
      int age;
}stu;

四、枚举类型
枚举类型的基本格式:
//定义枚举类型
enum Sex
{
      Man, //注意是,不是;
      Woman
};
//定义枚举变量
enum Sex s = Man;
printf("%d\n", s);
输出为
0

总结:
1、基本数据类型
1)int
long int\long:8个字节 %ld\%li
short int\short:2个字节 %d\%i
unsigned int\unsigned:4个字节 %zd\%zi
signed int\signed/int:4个字节 %d\%i
2)float\double
float:4个字节 %f
double:8字节 %f
3)char
char:1个字节 %c %d
char类型保存在内存中的是它的ASC码值:如:'A'—>65
2、数组
1)只能由同一种类型的数据组成
2)数据类型      数组名[元素个数]
3、结构体
1)可以由不同类型的数据组成
2)先定义类型,再利用类型定义变量
4、枚举

以上这几种都属于基础的常用的数据类型(还有指针后面专门讨论总结),我们要烂熟于胸,随时都要用到这些类型。




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值