欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS开发系列----C语言(内存及字符串)

程序员文章站 2022-10-16 16:03:16
一、内存 1.内存分配 静态内存分配:内存空间分配在栈,数据段,代码段。分配之后只能由释放,不能通过程序修改空间大小和释放空间,称为静态内存分配。所分配内存空间的带下,在【编译】时确定,在【运行】时...

一、内存

1.内存分配

静态内存分配:内存空间分配在栈,数据段,代码段。分配之后只能由释放,不能通过程序修改空间大小和释放空间,称为静态内存分配。所分配内存空间的带下,在【编译】时确定,在【运行】时无法修改。

【编译】:把我们的代码翻译成机器能够运行的机器码。

【运行】:机器按照编译完的机器码去执行。

动态内存分配:内存空间分配在栈空间,大小由程序员自己决定,可以通过代码对空间大小进行修改,通过代码对空间进行释放。这样分配的空间称为动态内存分配。

2.动态内存和静态内存分配的区别

静态内存分配:

①由系统创建,由系统释放;

②分配在栈,数据段,制度数据段;

③编译时确定大小,运行时无法修改;

④自动释放

动态内存分配:

①由程序员创建,由程序员释放

②分配在堆上;

③运行时创建大小,运行时可以修改;

④手动释放

3.动态内存分配概念及注意事项

①概念

【开辟空间】将一段空间在系统中注册为已经被占用

【释放空间】到系统中,解除注册,这个空间就变成了*空间(释放空间并不会把内部数据清除

②注意事项

【内存泄露】一直占用内存空间

【重复释放】释放多次

【提前释放】在释放之后还是用这个空间

4.手动开辟一个内存空间并在使用完释放
导入#include头文件#include

#include 

#include 

int main(int argc, const char * argv[]) {       

    char * p = null;       

    //在堆里面开辟1000个字节的空间  

     p = malloc(1000);         

    if (!p) {       

    //perror不仅会打印文字,还会打印错误原因       

    perror("malloc error");   

    }        

    //堆空间使用完毕,必须释放,   

    free(p);       

    return 0;

}

5.内存图
iOS开发系列----C语言(内存及字符串)

#include 
#include 

int c;

void func(void) {   

}

int main(int argc, const char * argv[]) {       

    int a;  

    printf("栈:%p\n",&a);       

    char * p = malloc(1000);   

    printf("堆:%p\n",p);  

    free(p);     

    printf("数据段:%p\n",&c);      

    char * q = "i have a dog";   

    printf("只读数据段:%p\n",q);       

    printf("代码段:%p\n",func);       

    return 0;

}

二、字符串

1.字符串就是一串字符,字符串中的每个字符占1个字节,字符的个数比可视的字符多一个。在字符串结尾处有一个’\0’,称作【尾零】。其ascii值就是0。

char *p = “hello world”;//该字符串中有12个字符,11个有效字符(可视字符)

2.网络传输数据的文件格式有两种json和xml,它们都是字符串。

3.字符串常用函数

导入头文件#include

#include 
#include 

int main(int argc, const char * argv[]) {

    char * p = "hello world";

    char a[] = "unverlivb!";

    size_t count = strlen(p);

    size_t countarr = strlen(a);

    printf("%ld\n",count);

    printf("%ld\n",countarr);

    return 0;

}

②拷贝字符串:char * strcpy(char * s1, const char * s2),将字符串s2拷贝到字符数组s1中,返回s1,即字符数组的首元素地址(使用这个函数的前提是s1有足够大的空间,如果越界,可能导致未知错误)

char a[200] = "他悄悄的走了,正如他悄悄的来";

char *p = "挥一挥衣袖,不带走一片云彩";

strcpy(a,p);

printf(“%s\n",a);

③拼接字符串:char * strcat (char * s1, const char * s2),s1是一个字符数组,s2是一个字符串或字符数组,将s2的内容拼接到s1后面,存储在s1中,返回s1。

char a[200] = "春水初生,春林初盛,春风十里 ,";

char * p = "不如你!";

printf("%s\n",strcat(a, p));

④查找并截取字符串:char * strstr(const char *s1, const char *s2),在字符串s1中,寻找子串首次出现的位置。返回子串在s1首次出现的位置的第一个字符的地址,如果没有找到,就返回一个空地址。

char *s1 = "aaabb123bccc1234";

char *s2 = "123";

char *s3 = "123456";

printf("%s\n",strstr(s1,s2));

printf(“%s\n",strstr(s1,s3));

⑤比较两个字符串的大小关系:int strcmp(const char * s1, const char * s2),s1大返回证书,s2大返回负数,相等返回0

char * s1 = "abcdexyz";

    char * s2 = "bcdefyza";

    int differ = strcmp(s1, s2);

    if (differ < 0)  {

        printf("%s 大于 %s",s2,s1);

    } else if  (differ > 0)  {

        printf("%s 小于 %s",s2,s1);

    } else  {

        printf("相等");

}

⑥分割字符串:char * strtok(char * s, const char * sep),将字符串分割成一个个子串。

char a[200] = "c oc ios swift";

char * p = strtok(a," ");

while (p != null) {

    printf("%s\n",p);

    p = strtok(null, " ");

}

小练习:

1.将这个字符串按照单词逆序i love you forever输出forever you love i

2.输入一个字符串,清除字符串中所有的标点符号:输入“hello,world!”,输出 helloworld

参考答案(一万个读者有一万个哈姆雷特,一万个程序员有一万种编码风格,答案仅供参考):

1.将这个字符串按照单词逆序i love you forever输出forever you love i

#include 
#include 

int main(int argc, const char * argv[]) {

    char buf[64] = "i love you forever";

    char * nx[13] = {};

    char ret[64] = {};

    char* p = strtok(buf, " ");

    int i = 0;

    while (p!=null) {

        nx[i++] = p;

        p = strtok(null, " ");

    }

    for (int j = i - 1; j >= 0; j--) {

        strcat(ret, nx[j]);

        strcat(ret, " ");

    }

    printf("%s\n",ret);

    return 0;

}

2.输入一个字符串,清除字符串中所有的标点符号:输入“hello,world!”,输出 helloworld

#include 

#include 

int main(int argc, const char * argv[]) {

    char *a = "hello,world!";

    char h[64] = {};

    strcpy(h, a);

    char ret[64] = {};

    char* p = strtok(h, " ,!");

    while (p!=null) {

        strcat(ret, p);

        p = strtok(null, " ,!");

    }

    printf("%s\n",ret);

    return 0;

}