黑马程序员-[C语言] 第二篇:数组、排序方法总结

来源:互联网 发布:象过河软件怎么用 编辑:程序博客网 时间:2024/06/05 03:43
 
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------
 C语言第七天知识点:

1. 获取变量地址的方法

1)输出地址用%p 

例如 int=b;

Printf(“%p”,&b);

2)注意:计算机分配内寻到额时候,从高地址向低地止分配,先定义的变量,分配的是高地址,后定义的变量是低地址。

地址分配的时候 不一定是连续的。

3)变量存储细节:低字节存储在低地址高字节存储在高地址

4)变量的地址:变量的首地址(变量在内存中占用的存储单元最小的地址),具体如下图:


 C语言第八天知识点:

1.Char 型常量的存储问题

Sizeof(‘ a ’);

-------->先找到‘a ’的ascii码值 97

-------->把97按照int类型进行存储

-------->把四个字节存储到内存中

Char=‘a’

---------->97

-----------?把97转换为2进制以字符进行存储

----------->把一个字 节存储到内存中

 

2. 数组:一组具有相同数据类型的数据的有序的集合。

1)数组元素:构成数组的数据。

2)数组的下标:是数组元素的位置的一个索引指示。

3)按存储类型分类:

数值数组:用来存放数值

字符数组:用来存放字符

指针数组:用来存放数据的指针

结构数组:用来存放结构类型的数据


4)按维度分类:

一维数组、二维数组、三维数组

 

5)数组作为参数

1.数组元素作为实参使用

2.数组名作为函数的形参或实参使用

一维数组定义:数组的每个元素都不是一个数组

一维数组格式:类型说明符  数组名 [数组长度];

例:int a[3]


6) Int 表示的是数组用来存放int类型的数据 不要理解成a是int类型

注意:

1)数组的长度可以是一个常量,也可以是常量表达式

2)数组名的命名规则严格按照标识符的命名规范

3)数组名不能和其他变量同名

4)数组的长度不可以是一个变量

5)数组的长度可以使用宏定义 例 #define m 3  int a[m]

7)数组的初始化方法:

1)定义的同时进行初始化

  (1)定义的同时进行全部初始化

(2)定义的同时进行部分的初始化未初始化部分被系统初始化为零

2)先定义,后初始化

注意:如果使用先定义后初始化的方式,如果部分数组元素被初始化,系统不会对没有定义的数组元素进行赋值为零。

 

3. 数组的存储方式

1)计算机会给数组分配一块连续的存储空间

2)数组名代表数组的首地址,从首地址位置,依次存入数组的第一个,第二个。——

3)每个元素占用相同的字节数

4)元素间的地址是连续的且从低到高存储

5)数组之间的地址不一定连续且先定义的数组分配在高地址

6)数组名是一个常量代表数组的首地址

 

4. 数组长度的计算

Int a[5];

Int len;

Len=sizeof(a);  表示数组a所占用的总字节数。

则len=5*sizeof(a[0]);

Sizeof(a[0])表示每个int类型的数组元素所占用的字节数。

 

5. 数组名做参数

1)数组名做实参时,形参也必须是相同类型的数组。

2)数组名做实参传递到形参时。实参与形参之间不是值传递而是地址传递。实参数组名将该数组的起始地址传递到形参数组。切实参与形参数组地址指向同一地址空间。

3)数组元素作实参传递到形参时,实参与形参之间是值传递。


C语言第九天知识点总结:

1.冒泡排序:

实现:双层循环:外层循环 表示循环的趟数  i<len-1;里层循环表示比较的次数j<len-1-i。实现代码如下:

<pre name="code" class="vb">
#include <stdio.h>int main(int argc, const char * argv[]) {    int a[10];    printf("请输入10个数字:\n");    for (int i=0;i<10;i++) {        scanf("%d",&a[i]);        printf("\n");              }    for (int j=0;j<9;j++) {        for (int i=0; i<9-j; i++) {            if (a[i]>a[i+1]){                int temp =a[i];                a[i]=a[i+1];                a[i+1]=temp;            }        }    }    printf("排序后的10个数字为:\n");    for (int i=0; i<10; i++) {        printf("%d\t",a[i]);                }    return 0;}

2.选择排序:是一种简单直观的排序算法。原理:首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,在从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。依次类推,直到所有元素均排序完毕。实现:双层循环:外层循8环 表示循环的趟数 i<len-1 里层循环 找出最小数 j=i+1 ;j<len。实现代码如下:

#include <stdio.h>int main(int argc, const char * argv[]) {    int a[10];    int i,j;    printf("请输入10个数字:\n");    for (int i=0;i<10;i++) {        scanf("%d",&a[i]);        printf("\n");    }    for (j=0; j<9; j++) {        for (i=0;i<9; i++) {            if(a[j]>a[i+1])                a[j]=a[i+1];        }        printf("排序后的10个数字为:\n");        for (int j=0; j<10; j++) {            printf("%d\t",a[j]);        }    }    return 0;}

3. 折半查找:在有序的的表中,取中间元素作为比较对象,若给定值数与中间元素相等,则查找成功;若给定值小于中间元素的数,在中间元素的左半区继续查找。否则在右半区查找。实现代码如下:

<pre name="code" class="vb">#include <stdio.h>int serchscore(int a[],int key,int len){    int low=0,high=len-1,mid;    mid=(low+high)/2;    while (low<high) {        {            if(key>a[mid]){                low=mid+1;            }else if(key<a[mid]){                high=mid-1;            }else                return mid;        }        return -1;    }int main(int argc, const char * argv[]){    int a[10] = {12,23,32,34,38,45,52,55,60,128};     int low = serchscore(a,34,10);    printf("low=%d",low);    return 0;}

4. 二维数组:可以看做一个特殊的一位数组,这个一维数组的每个元素又是一个一维数组。

1. 二维数组的定义:二维数组定义与一位数组定义类似,初始化注意事项:   1)  第一位长度可以省略,但是第二维的长度不可以省略;   2)  二维数组的存储方式  :数组的首地址==数组名=&[0]==&[0][0]

   3) 格式:类型说明符 数组名[常量表达式1][常量表达式2];

2. 二维数组的存储

 二维数组是按行存储的,在地址中的分配空间是连续的。

3. 注意:

1)数组名不能和变量名同名

2)数组的长度可以是常量表达式

3)Xcode特有:int m=2,n=2;

               Int [n][m];  //其他编译器可能没有

4)二维数组中第一维可以省略

C语言第十天知识点总结:

1  %s从给定地址开始,一直输出字符,直到遇到\0就停止了;  注意:  如果以%s 输出的话,注意空格问题,如果输入的字符串有空格,则空格之后的字符无法别接收。

2. 输入的字符串长度要小于数组长度。

3. C语言中字符串处理函数有:  puts  gets   strlen  strcpy strcmp  strcat

4. 指针变量的注意事项:      1   1)必须有*   2)指针变量,归根结底还是变量,3) 指针变量不能存放数值或字符。      2   “ * ”的两种用法   1)用于定义,一个指针变量; 2)给指针变量指向的内存空间的内容。 3) 存储指针变量指向的存储空间内容。

C语言第十一天知识点总结:

1.一维数组指针                                                                                                                   注意:(1)数组名不代表整个数组,只代表数组的首元素的地址(是一个常量,若数组名++,是不对的)。(2) “P=a”,的作用是“把a 数组的首元素地址付给指针变量 P”,而不是把数组a各个元素的值付给P。2. 一维指针数组:一个数组元素值为指针则为指针数组,    格式为:类型说明符 *数组名[数组长度];应用:数组的逆序:

</pre><pre name="code" class="objc">#include <stdio.h>void nixu(int *p,int len){    int *x,*i,*j,m=(len-1)/2,temp;    i=p;j=p+len-1;x=p+m;    for (;i<x; i++,j--) {        temp=*i;        *i=*j;        *j=temp;    }}int main(int argc, const char * argv[]) {    int i=0,a[10];    printf("请输入十个数字:以空格隔开\n");    for (int i=0; i<10; i++) {        scanf("%d",&a[i]);    }    for (int i=0; i<10; i++) {        printf("您输入的十个数字是:%d\n",a[i]);    }    nixu(a,10);    for (int i=0; i<10; i++) {        printf("%d\t",a[i]);    }    return 0;}
指针变量之间可以做减法运算,主要为了判断两个指针变量是否连续,或者判断两个指针变量之间相隔几个元素:   具体计算公式为:(地址1-地址2)/sizeof (所指向的数组)。
 关系运算:  如果p1>p  运算结果为1,表示p1在高位,为0,表示p在高位。
3. 二维数组指针: 数组指针变量说明:
    一般形式为:数据类型(*指针变量名)[二维数组列表];
二维数组的行指针和列指针:


4.字符串指针   格式为:char   *变量名=”字符串内容”,(字符串内容是常量),作用是保存一个字符串。    *str=“abc”  str 只是保存了字符串常量的首地址,是一个指针变量。字符串保存在常量区,在常量区保存的数据都只是可读的,不可以改变。
5.二维字符串数组的概念:
        一维字符数组   char  ch[10]={‘a’,’b’};或者  char  ch[]=“abc’;
         二维字符数组  char ch[3][10]={{‘a’,’b’},{‘b’},{‘c’}};  或者 char ch3[3][10]={“abc”,”def”,”erf”};
   字符串类型的指针数组  格式   char  *name[3]={“abc”,”def”};
应用例题:字符串排序:
#include <stdio.h>#include <strings.h>void sort(char *name[],int n){    char  * temp;    for (int i=0; i<n-1; i++) {        for (int j=1; j<n; j++) {            if (strcmp(name[i], name[j])<0) {                temp=name[i];                name[i]=name[j];                name[j]=temp;            }        }    }}int main(int argc, const char * argv[]) {    char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Compter Design"};    int n=5;    sort(name, n);    for (int i=0; i<5; i++) {        printf("%s\n",name[i]);    }    return 0;}


6. 有关二维数组a的有关指针:




0 0
原创粉丝点击