Objective-C学习准备__C语言7

C语言的准备到这里就差不多了最后来学习一下动态数组

我们知道C语言的数组在定义的时候都必须指定长度,那么如何定义动态的数组呢

事实上动态数组就是在堆中划出来一片空间供你使用 而这片空间只能用指针访问,我们来看代码

#include <stdio.h>
#include <stdlib.h>
int main(){
   int* arr1 = malloc(3*sizeof(int));
   int* arr2 = calloc(3 , sizeof(int));
   arr1[0]=2;
   arr1[2]=4;
   printf("%d\n",arr1[0]);
   printf("%d\n",arr1[1]);
   printf("%d\n",arr1[2]);
   arr2[0]=20;
   arr2[2]=40;
   printf("%d\n",arr2[0]);
   printf("%d\n",arr2[1]);
   printf("%d\n",arr2[2]);
   realloc(arr1,5*sizeof(int));
   arr1[3]=23;
   printf("%d\n",arr1[3]);                    free(arr1);  free(arr2);
}    

可以看到malloc和calloc都能创建动态空间数组只是一个函数是两个参数一个函数是一个参数,为什么呢?

多运行几次,仔细观察arr1[1]与arr2[1]的输出结果   这两个空间均没有赋值 arr1[1]中还保留有原来内存中的数据,但arr2[1]却是0;

得出结论calloc创建的动态空间会进行数据清零,而malloc创建则不会,因为前者有两个参数可以知道多少个字节做一次清零处理;

realloc则能修改原动态数组的长度;

最后还有一个free()函数,用于释放动态空间,每个空间用完之后都要进行释放不然一直占用空间,久而久之越来越多的占用就会造成内存泄露,电脑越来越卡

既然已经知道动态数组的创建了那么不妨思考一下能否做出java或C#中类似于List单链表的集合呢?

单链表,用结构体表示是这样

typedef struct List{
    int value;
    struct List *next;
}ArrayList;

创建一个node类型指针  创建动态数组空间

node_t *head= malloc(sizeof(ArrayList));
head->value = 1;
head->next = NULL;

如何增加单链表呢?

head->next = malloc(sizeof(ArrayList));
head->next->value = 2;
head->next ->next = NULL;
head->next->next = malloc(sizeof(ArrayList));
head->next->next->value = 3;
head->next->next->next = NULL;
printf("%d\n",head->value);
printf("%d\n",head->next->value);
printf("%d\n",head->nex->nextt->value);

这样是不是很麻烦?  我们可以用一个方法来实现

void Listadd(ArrayList** head,int val){
    if((*head)==NULL){
        (*head)=malloc(sizeof(ArrayList));
        (*head)->value=val;
        (*head)->next=NULL;
        return;
    }
    ArrayList* he=*head;
    while(he->next!=NULL){
        he=he->next;
    }
    he->next=malloc(sizeof(ArrayList));
    he=he->next;
    he->value=val;
    he->next=NULL;
}

有了这个方法就可以直接调用add增加数据集了

这里提一下  -> 是指针访问结构体的符号  结构体变量名访问是打点访问

int main(){
 ArrayList* p=NULL;
 Listadd(&p,2);
 Listadd(&p,1);
 Listadd(&p,5);
}

既然有添加那么肯定有删除,删除就是用free()方法释放空间具体做法我就不多说了 大家好好思考一下..下面是我写的一个例子

ArrayList.c

#include <stdlib.h>
#include <stdio.h>
#include "ArrayList.h"
void Listadd(ArrayList** head,int val){
    if((*head)==NULL){
        (*head)=malloc(sizeof(ArrayList));
        (*head)->value=val;
        (*head)->next=NULL;
        return;
    }
    ArrayList* he=*head;
    while(he->next!=NULL){
        he=he->next;
    }
    he->next=malloc(sizeof(ArrayList));
    he=he->next;
    he->value=val;
    he->next=NULL;
}
void ListaddFrist(ArrayList** head,int val){
    if((*head)->value==0){
        (*head)->value=val;
        return;
    }
    ArrayList* p=malloc(sizeof(ArrayList));
    p->value=val;
    p->next=*head;
    *head=p;
}
void ListaddLast(ArrayList** head,int val){
    Listadd(head,val);
}
void ListRemoveFrist(ArrayList** head){
    ArrayList*p=(*head)->next;
    free(*head);
    *head=p;
}
void ListRemoveLast(ArrayList** head){
    if((*head)==NULL){
        printf("没有可释放的动态数组空间\n");
        return;
    }
    if((*head)->next==NULL){
        free(*head);
        printf("该动态数组空间已全部释放\n");
        return;
    }
    ArrayList* he=*head;
    while(he->next->next!=NULL)
        he=he->next;
    free(he->next);
    he->next=NULL;
}
void ListRemoveby(ArrayList** head,int i){
    ArrayList*p;
    if(i==0){
        ListRemoveFrist(head);
        return;
    }
    if(i==1){
        p=(*head)->next->next;
        free((*head)->next);
        (*head)->next=p;
        return;
    }
    ArrayList* he=*head;
    while(i!=1){
        he=he->next;
        i--;
    }
    p=he->next->next;
    free(he->next);
    he->next=p;
}
void print(ArrayList* head){
    while(head!=NULL){
        printf("%d\t",(*head).value);
        head=(*head).next;
    }
}
ArrayList*Listequals(ArrayList** head,int i){
    ArrayList* he=*head;
    while(i!=0){
        he=he->next;
        i--;
    }
    return he;
}

ArrayList.h

#ifndef _ArrayList_H_
#define _ArrayList_H_
typedef struct arr{
    int value;
    struct arr* next;
} ArrayList;
ArrayList* NewArrayList();
void Listadd(ArrayList**,int);
void print(ArrayList*);
void ListaddFrist(ArrayList**,int);
void ListaddLast(ArrayList**,int);
void ListRemoveFrist(ArrayList** head);
void ListRemoveLast(ArrayList** head);
ArrayList*Listequals(ArrayList**,int);
void ListRemoveby(ArrayList**,int);
#endif

test.c

#include <stdio.h>
#include <stdlib.h>
#include "ArrayList.h"
int main(){
    ArrayList* p=NULL;
    Listadd(&p,2);
    Listadd(&p,3);
    Listadd(&p,4);
    Listadd(&p,5);
    ListaddLast(&p,6);
    print(p);
    printf("\n-----------\n");
    ListaddFrist(&p,1);
    ListaddFrist(&p,0);
    print(p);
    printf("\n-----------\n");
    ListRemoveFrist(&p);
    print(p);
    printf("\n-----------\n");
    ListRemoveLast(&p);
    print(p);
    printf("\n-----------\n");
    ArrayList*test=Listequals(&p,2);
    printf("indexOf(2)=%d\n",test->value);
    printf("\n-----------\n");
    printf("remove indexOf(2)\n");
    ListRemoveby(&p,2);
    print(p);
    printf("\n-----------\n");
}
以上综合了我们复习过的知识..C就讲到这里了...如果有疑问的可以留言
时间: 2024-08-27 23:37:52

Objective-C学习准备__C语言7的相关文章

Objective-C学习准备__C语言5

继续学习指针.. 下面来看指针的指针 顾名思义指针的指针就是指向指针所在地址的一个指针也叫作二级指针,废话不多说 我们来看代码定义方式及效果 #include <stdio.h> int main(){ int a=10; int* p=&a; int** s=&p; printf("%d\n",*p); printf("%d\n",**s); printf("------------\n"); printf(&quo

objective - c 类和对象

知识点 1.初步认识 OC 2.xcode使用 3.面向对象编程思想,类和对象 4.类的定义和使用 5.类的实例化--对象 6.声明和实现相分离 =========================================== 1.需要理解的(理论部分) 第一部分:OC和面向对象 1.1.OC语言的历史,特点.重要程度 [什么是OC] objective - c   在C语言基础上开发, 面向对象的语言: 注意C语言和oc语言语法的区别: IOS, iphone, ipad … [进入OC

iOS书写高质量代码之耦合的处理

原创 2016-12-26 MrPeak MrPeak杂货铺 耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量.今天Peak君和大家聊聊耦合这个基本功话题,一起捋一捋iOS代码中处理耦合的种种方式及差异. 简化场景 耦合的话题可大可小,但原理都是相通的.为了方便讨论,我们先将场景进行抽象和简化,只讨论两个类之间的耦合. 假设我们有个类Person,需要喝水,根据职责划分,我们需要另一个类Cup来完成喝水的动作,代码如下: //Person.h @int

设计模式(五):PROTOTYPE原型模式 -- 创建型模式

1.定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 2.适用场景 原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是有对象的内部提供克隆的方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂模式与抽象工厂都是通过工厂封装具体的new操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景的时候,可能使用原型模式更简单也效率更高. • 1)当一个系统应该独立于

iOS书写高质量代码之耦合的处理 干货!

iOS书写高质量代码之耦合的处理 耦合是每个程序员都必须面对的话题,也是容易被忽视的存在,怎么处理耦合关系到我们最后的代码质量.今天Peak君和大家聊聊耦合这个基本功话题,一起捋一捋iOS代码中处理耦合的种种方式及差异. 简化场景 耦合的话题可大可小,但原理都是相通的.为了方便讨论,我们先将场景进行抽象和简化,只讨论两个类之间的耦合. 假设我们有个类Person,需要喝水,根据职责划分,我们需要另一个类Cup来完成喝水的动作,代码如下: 1 2 3 4 5 6 7 8 9 //Person.h

GCC、ARM-LINUX-GCC、ARM-ELF-GCC浅析

一.GCC简介: The GNU Compiler Collection,通常简称GCC,是一套由GNU开发的编译器集,为什么是编辑器集而不是编译器呢?那是因为它不仅支持C语言编译,还支持C++, Ada, Objective C等许多语言.另外GCC对硬件平台的支持,可以所无所不在,它不仅支持X86处理器架构, 还支持ARM, Motorola 68000, Motorola 8800, Atmel AVR, MIPS等处理器架构. 二.GCC内部结构: GCC内部结构主要由Binutils.

GCC、Makefile编程学习

相关学习资料 http://gcc.gnu.org/ https://gcc.gnu.org/onlinedocs/ http://zh.wikipedia.org/zh/GCC http://blog.csdn.net/casularm/article/details/316149 http://www.bccn.net/Article/kfyy/cyy/jc/200409/9.html http://linux.chinaunix.net/techdoc/develop/2008/12/16

设计模式(四)原型模式Prototype(创建型)

1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮寄给另外一个地址,这里是邮寄地址……”顾客一边说一边把

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv