zoukankan      html  css  js  c++  java
  • ios学习记录 day10

    1.指针  直接访问 //a = 20     间接访问 //通过地址访问内存内容

    2.&  取地址     * 取内容    & 和 *配套使用 他俩正好相反

    3.内存   栈区 从高向低分配 | 堆区 从低向高分配

      1)、栈区(stack)—   由编译器自动分配释放   ,存放函数的参数值,局部变量的值等。其 
      操作方式类似于数据结构中的栈。 
      2)、堆区(heap)   —   一般由程序员分配释放,   若程序员不释放,程序结束时可能由OS回 
      收   。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 
      3)、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的 
      全局变量和静态变量在一块区域,   未初始化的全局变量和未初始化的静态变量在相邻的另 
      一块区域。   -   程序结束后由系统释放。 
      4)、文字常量区   —常量字符串就是放在这里的。   程序结束后由系统释放 
      5)、程序代码区—存放函数体的二进制代码。 

        int a = 5;
        int b = 3;
        int c = 2;
        printf("%p %p %p ",&a,&b,&c);

    打印:0x7fff5fbff8bc
           0x7fff5fbff8b8
           0x7fff5fbff8b4

    4.指针定义   类型 变量名 = 初值   int * p = NULL;   //int * 是类型  NULL恒等于0

        int a = 5;
        int * p = NULL;
        p = &a;

        *p = 5;//通过地址改变量的值,相当于 a = 5
        printf("%p ",p);
        printf("%d ",*p);

        int b = 3;
        p = &b;//指针变量的赋值意味 重指向

    5.int * p = 5;

       *p = 6;//错误的 常量不可改!

    6.不同类型的指针变量的区别: 指针的自增运算移动多少个字节   用*取值时取多少字节

       内存地址大小只与操作系统有关:32位系统指针占4个字节,64位系统指针占8个字节  

       a恒等于&a[0]

    7.数组名  首元素的首地址   指针可以当数组名使用   

        int array[5] = {4,7,1,2,9};
        int * p = array;
        *(p + 3) = 16;//p[3] = 16 //*(array + 3) //array[3] //等价
        printf("%d ",*(p + 3));

    8.指针与数组区别 1)所占空间不同 2)数组名是常量地址不能重指向

    9.指针与字符串

        char str[] = "shenqingjun";
        char * p = str;
        printf("%s ",p);

    10.字符指针 操作字符 *(p+4)=v,操作字符串printf("%s ",(p+1));

    11.指针数组 (是数组  存放的指针)    //数组指针 (是指针 指向数组)   

        char * str[4] = {"shenqingjun","zhaoyunlong","anyongxue","huaqiang"};
        for (int i = 0 ; i < 4 - 1; i++) {
            for (int j = 0; j < 4 - i - 1; j++) {
                if (strcmp(str[j], str[j + 1]) >0){//*str[j] > *str[j + 1]
                    char * temp = str[j];
                    str[j] = str[j + 1];
                    str[j + 1] = temp;
                }
            }
        }

        for (int i = 0; i < 4; i++) {
            printf("%s ",str[i]);
        }
    //    char * temp = str[0];//*p 是内容
    //    str[0] = str[1];//换的是地址 内容不能换
    //    str[1] = temp;
    课上练习:

       面试题:1.有一字符串包含数字字母,编程去数字.1)要求在原字符串中操作2)使用指针处理

    1) char s[] = "iP5he3";
        char * p = s;
        char * pp = s;
        while (*p != '') {
            if (!(*p >= '0' && *p <= '9')) {
                *pp = *p;
                pp++;
            }
            p++;
        }
        *pp = '';
        printf("%s ",s);

    2)void myStrcpy(char * s1,char * s2){
        while ((*s1++ = *s2++) != '');
    }
    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])
    {char s[] = "iP5he3";
        char * p = s;
        while (*p != '') {
            if ((*p >= '0' && *p <= '9')) {
                myStrcpy(p,p + 1);
                p--;
            }
            p++;
        }
        printf("%s ",s);
    return 0;
    }
    2.有一个字符串aabcabd 输出aabcd(相邻重复字母不去掉,不相邻的重复去掉)

    char s1[] = "aabcabd";
        char * p = s1;
        char * p1 = s1;
        char * p2 = s1;
        int length = 0;
        
        *p1 = *p;
        p1++;
        p++;
        length++;
        while(*p != '') {
            p2 = s1;
            for (int i = 0; i < length; i++) {
                if (*p == *p2) {
                    break;
                }
                p2++;
            }
            if (p2 == p1) {
                * p1 = *p;
                p1++;
                length++;
            }
            if (*p == *(p1-1) && p == p1) {
                *p1 = *p;
                p1++;
                length++;
            }
            p++;
        }
        *p1 = '';
        
        printf("%s ",s1);

    作业:

    1、输入10个整数,将其中最小的数与第一个数对换,把最大的数和最后一个数对换,写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。

    void swap(int * a,int * b){
        iint * temp = *a;
        *a = *b;
        *b = temp;
    }
    void shuru(int * array,int count){
        for (int i = 0; i < count; i++) {
            scanf("%d",array + i);
        }
    }
    void duihuan(int * array,int count){
        int * max = array;
        int * min = array;
        for (int i = 0; i < count; i++) {
            if (*max < *(array + i)) {
                max = array + i;
            }
        }
        swap(max,array + count - 1);
        for (int i = 0; i < count; i++) {
            if (*min > *(array + i)) {
                min = array + i;
            }
        }
        swap(min,array);
    }
    void shuchu(int * array,int count){
        for (int i = 0; i < count; i++) {
            printf("%d ",*(array + i));
        }
        printf(" ");
    }

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

        int array[10] = {0};
        shuru(array, 10);
        duihuan(array, 10);
        shuchu(array, 10);

        return 0;
    }
    2、在主函数中输入10个等长的字符串。用另一个函数对它们排序,然后在主函数输出10个已经排好的字符串。

    void scanString(char * str[],int count){
        for (int i = 0; i < count; i++) {
            scanf("%s",str[i]);
        }
    }
    void sort(char * array[],int count){
      for (int i = 0 ; i < count - 1; i++) {
            for (int j = 0; j < count - i - 1; j++) {
                if (strcmp(array[j],array[j + 1]) > 0) {
                    char * temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                }
            }
        }
    }

    #import <Foundation/Foundation.h>

    int main(int argc, const char * argv[])
    {char *array[10] = {0};
        char string[10][50] = {0};
        for (int i = 0; i < 10; i++) {
            array[i] = string[i];
        }
        scanString(array, 10);
        sort(array, 10);
        for (int i = 0; i < 10; i++) {
            printf("%s ",array[i]);
        }

    return 0;
    }

    3.冒泡排序-指针操作

    void bubblSort(int * array , int count){
        for (int i = 0; i < count - 1; i++) {
            int * pp = array;
            for (int j = 0; j < count - i - 1; j++) {
                if (*pp > *(pp + 1)) {
                    int temp = *pp;
                    *pp = *(pp + 1);
                    *(pp + 1) = temp;
                }
                pp++;
            }
        }
    }

  • 相关阅读:
    朱刘算法---有向图的最小生成树
    527D Clique Problem 判断一维线段没有两辆相交的最大线段数量
    Tex中的引号
    DAY 96 flask05
    DAY 95 flask04
    DAY 94 flask03
    DAY 93 flask02
    DAY 92 flask01
    DAY 91 爬虫05
    DAY 90 爬虫04
  • 原文地址:https://www.cnblogs.com/lxllanou/p/3597054.html
Copyright © 2011-2022 走看看