————————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改为
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、枚举
以上这几种都属于基础的常用的数据类型(还有指针后面专门讨论总结),我们要烂熟于胸,随时都要用到这些类型。