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\n%p\n%p\n",&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\n",p);
    printf("%d\n",*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\n",*(p + 3));

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

9.指针与字符串

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

10.字符指针 操作字符 *(p+4)=v,操作字符串printf("%s\n",(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\n",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 != '\0') {
        if (!(*p >= '0' && *p <= '9')) {
            *pp = *p;
            pp++;
        }
        p++;
    }
    *pp = '\0';
    printf("%s\n",s);

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

int main(int argc, const char * argv[])
{char s[] = "iP5he3";
    char * p = s;
    while (*p != '\0') {
        if ((*p >= '0' && *p <= '9')) {
            myStrcpy(p,p + 1);
            p--;
        }
        p++;
    }
    printf("%s\n",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 != '\0') {
        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 = '\0';
    
    printf("%s\n",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("\n");
}

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++;
        }
    }
}

posted @ 2014-03-13 11:30  lxl奋小斗  阅读(158)  评论(0编辑  收藏  举报