数组,函数的学习

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() 代码运行就会报错。

     

猜你喜欢

转载自blog.csdn.net/weixin_42720703/article/details/81174411