1.一维数组:
定义: 类型说明符 数组名[常量表达式]; 例如: int a[10];
它表示定义了一个整形数组,数组名为a,有10个元素。
【注意】:C语言不允许对数组的大小作动态定义,即数组的大小不依赖于程序运行过程
中变量的值。例如 int k; int a[k];这就是错误的写法。
数组在内存中的存放:
int a [5] 一共五个int型元素,一共占4*5个字节。
a[0] |
a[1] |
a[2] |
a[3] |
a[4] |
0x100 ox104 ox108 ox10c ox110 ox114
不同机器对数据存放的方式也不同,这就引出一个字节序的概念
字节序分两种:
大段字节序:高字节存放在低地址 低字节存放在高地址
小端字节序:高字节存放在高地址 低字节存放在低地址
对一维数组初始化可以如下:
1 #include <stdio.h>
2
3 int e[5];
4 int main()
5 {
6 int i;
7 int array[5];
8 int b[5] = {1,2,3,4,5};
9 int c[5] = {1,2};
10 int d[5] = {0};
11 for(i = 0 ; i < 5 ; i++)
12 printf("%d ",array[i]);
13 printf("\n");
14 for(i = 0 ; i < 5 ; i++)
15 printf("%d",b[i]);
16 printf("\n");
17 for(i = 0 ; i < 5 ; i++)
18 printf("%d",c[i]);
19 printf("\n");
20 for(i = 0 ; i < 5 ; i++)
21 printf("%d",d[i]);
22 printf("\n");
23 return 0;
24 }
运行结果如下:
此处需注意的是未初始化的局部变量是垃圾值,全局变量是0.
求数组的长度公式: sizeof(array)/ sizeof(array[0])
2.一位数组的地址:
1 #include <stdio.h>
2
3 int e[5];
4 int main()
5 {
6 int b[5] = {1,2,3,4,5};
7 printf("%p\n",&b[0]);
8 printf("%p\n",b);
9 printf("%p\n",&b);
10 printf("%p\n",&b+1);
11 return 0;
12 }
printf("%p\n",&b[0]); 表示数组首元素地址,单位是4字节
printf("%p\n",b); b是数组名,同时也是数组首元素的地址,单位也是4字节
printf("%p\n",&b); 数组的地址,单位是一个数组,20字节
printf("%p\n",&b+1); 加了20字节
3.二维数组:
定义:类型说明符 数组名[常量表达式1][常量表达式2];
例如:定义a为3×4(3行4列)的数组,b为5×10(5行10列)的数组。
如下:float a[3][4],b[5][10];
【注】:常量表达式2一定要有!
初始化:可以全部赋值也可以部分赋值
1 #include <stdio.h>
2
3 int main()
4 {
5 int i,j,a[3][4]={1,2,3};
6 for(i=0;i<3;i++)
7 {
8 for(j=0;j<4;j++)
9 {
10 printf("%d ",a[i][j]);
11 }
12 printf("\n");
13 }
14 return 0;
15 }
4.二维数组的地址:
printf("%p\n",&a[0][0]); 首元素地址,单位4字节
Printf("%p\n",a[0]); 首行首元素地址,单位4字节
printf("%p\n",&a[0]); 首行地址,单位12字节
printf("%p\n",a); 首行地址,单位12字节
printf("%p\n",&a); 数组地址,单位48字节
【注】:printf("%p %p\n",a[1],*(a+1));
运行一遍会发现两个一样的,所以 a[x] = *(a+x)
4.1 字符数组:
初始化两种:可逐个字符赋给数组中各元素:char c[10]={‘I’,’ ‘,‘a’,‘m’,‘’,‘h’,‘a’,‘p’,‘p’,‘y’}
也可以直接 char a[20]="helloworld!"
当然也可以去从键盘输入获得:scanf("%s",a) 【注】这里a就是地址
不用“&”。
4.1.2 strcat ()、strcpy()、strcmp()函数
用这些函数时都要在头文件加上<stdio.h>
char str[20]="hello";
char ptr[20]="world";
strcat(str,ptr);//将字符串ptr链接到str后方。
strcpy(str,ptr);//字符串拷贝函数 把ptr指向的字符串拷贝到str中(并且\0也会覆盖)。
strncpy(str,ptr,3)//指定拷贝3个字符并从头覆盖。
【注】:char str[20]; str = "helloworld";这种定义字符串数组是 错误 的。
所以可以得出字符串赋值有三种:
1.char str[20]="hello"
2.char str[20];
str[0]='h';str[1]='g';……..依次赋值
3.strcpy(str,"hello";
Strcmp(字符串1,字符串2) 以此从第一个字符开始比较,
1 #include <stdio.h>
2 #include <string.h>
3
4 int main()
5 {
6 char a[20]="无底洞!abc";
7 char str[20]="helloworld";
8 //strncpy(a,str);
9 //strcat(a,str);
10 //strncpy(a,str,3);
11 if(strncmp(a,str,6) == 0)
12 printf("%s = %s\n",a,str);
13 if(strncmp(a,str,6) < 0)
14 printf("%s < %s\n",a,str);
15 if(strncmp(a,str,6) > 0)
16 printf("%s > %s\n",a,str);
17 //printf("%s\n",a);
18 return 0;
19 }
~
5.函数:
C程序:
只包含一个主函数main()
也可以包含一个主函数和若干个其它函数(库函数和自定义函数)
函数说明:
函数类型 函数名(形式参数类型说明表)
{
声明部分
执行部分
}
函数基本分两类:void print( ) 无返回值,无形参
int add(int x ,int y)有返回值,有形参
形参的特点:形参和实参个数相对应,他们类型相同,名字可以一致;
地址传递方式:函数调用时,将数据的存储地址作为参数传递给形参
函数调用过程:
(1)通过函数名找到函数的入口地址(函数名就是地址)
(2)给形参分配空间
(3)传值(把实参传给形参)(值传递,地址传递)
(4)执行函数体
(5)返回
(6)释放空间(释放的是栈空间)
变量的存储类型:
例如现在有两个c文件:1.c 和2.c 其中2.c是1.c里面的自定义功能函数
在1.c中定义一个全局变量,在2.c中只要再声明一个外部变量即可使用1.c中的变量
1 #include <stdio.h>
2
3 int num = 100;
4 int main()
5 {
6 print();
7 return 0;
8 }
1 #include <stdio.h>
2
3 extern int num;
4 void print()
5 {
6 printf("num=%d\n",num);
7 }
运行后:
static:1.修饰全局变量,改变变量的作用域,只能在当前文件被调用,其他文件不能用。
在第一个代码中:若是 static num = 100;那第二个代码中num就无法使用
2.修饰函数改变函数的作用域,只能在当前文件中被调用。
若是在第二个代码中 static void print() 代码运行就会报错。