C-----------------LessionPointer

来源:互联网 发布:人工智能基础教程 pdf 编辑:程序博客网 时间:2024/06/03 05:55

#import <Foundation/Foundation.h>


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

{

    /*

    //访问数据的方式,1.直接访问,直接访问变量.2.间接访问,找到变量的地址.

    int a = 10;

    printf("%d\n", a);

    //指针变量,专门用来存储地址的变量.

    //int * :指针变量的类型;  p :变量名;  NULL : 初值(指向一个无效区域).

    //变量定义时 * 的作用:告诉编译器后边的变量是一个指针变量,用来存储地址.

    //int :1.当通过指针变量取数据时一次性读取几个字节的数据.2.当指针变量+1或者-1时,一次性改变几个字节.

    //指针变量的空间大小和操作系统位数有关,32位4个字节,64位8个字节.char *,float *,short *,int *.

    int *p = NULL;  //NULL == 0

    p = &a; //p存储a的地址

    printf("%d\n", *p);

    *p = 20; //修改p指向的内存空间的数据 此时*的作用:根据指针变量p找到指向的内存空间,如果*p在等号的左边,中是赋值操作,否则都是取值操作.

    printf("%d\n", a);

    */

    /*

    int a = 10, b = 5;

    int *p1 = &a; //指向a

    int *p2 = &b; //指向b

    //通过指针变量交换a和b里面的值

    int temp = *p1;

    *p1 = *p2;

    *p2 = temp;

    printf("a = %d, b = %d\n", *p1, *p2);

    

    //通过p1访问b,通过p2访问a;

    printf("a = %d, b = %d\n", *(p2 + 1), *(p1 - 1));

    */

    /*

    int a = 10, b = 20, c = 30;

    int *p = &b;

    printf("b = %d\n", *p);

    printf("a = %d\n", *(p + 1));

    printf("c = %d\n", *(p - 1));

    //访问到a

    printf("a = %d\n", a);

    printf("a = %d\n", *(&a));

    printf("a = %d\n", *(p + 1));

    printf("a = %d\n", *(&b + 1));

    printf("a = %d\n", *(&c + 2));

    p = &c;  //指针变量重新赋值的过程就叫做指针重指向,将p指向c.

    printf("%d", *p);

     */

    /*

    int a[5] = {1, 2, 3, 4, 5};

    int *p = a; //存储数组的首地址

    printf("%d\n", *p);

    printf("%d\n", *(p + 2));

    printf("%d\n", 3[a]); // *(3 + a)  a[3] 输出同等于*(a + 3)

    //a[a] --- *(3 + a)  a[3] --- *(a + 3)   其中a为数组首地址

    //输出数组元素

    for (int i = 0; i < 5; i++) {

        printf("%d ", *(p + i));

    }

    printf("\n");

    for (int i = 4; i >= 0; i--) {

        printf("%d ", *(p + i));

    }

    printf("\n");

    int b[10] = {0};

    //通过指针操作

    int *q = b;

    //赋值[20, 40];

    for (int i = 0; i < 10; i++) {

        *(q + i) = arc4random() % (40 - 20 + 1) + 20;

        printf("%d ", *(q + i));

    }

    printf("\n");

    //升序排序

    for (int i = 0; i < 10 - 1; i++) {

        for (int j = 0; j < 10 - 1 - i; j++) {

            if (*(q + j) > *(q + j + 1)) {

                int temp = *(q + j);

                *(q + j) = *(q + j + 1);

                *(q + j + 1) = temp;

            }

        }

    }

    //输出

    for (int i = 0; i < 10; i++) {

        printf("%d ", *(q + i));

    }

    printf("\n");

     */

    /*

    int a[10] = {0};

    int *p = a;

    //1.赋值[10, 50].

    for (int i = 0; i < 10; i++) {

        *(p + i) = arc4random() % (50 - 10 + 1) + 10;

        printf("%d ", *(p + i));

    }

    printf("\n");

    //2.求所有元素的最大值

//    int max = *p;

//    for (int i = 0; i < 10; i++) {

//        if (max < *(p + i)) {

//            max = *(p + i);

//        }

//    }

//    printf("max = %d\n", max);

    //3.求所有元素的最小值

    int min = *p;

    for (int i = 0; i < 10; i++) {

        if (min > *(p + i)) {

            min = *(p + i);

        }

    }

    printf("min = %d\n",min);

    //4.求所有元素的第二大值

//    int max = 0;

//    int secondMax = 0;

//    for (int i = 0; i < 10; i++) {

//        if (*(p + i) > max) {

//            secondMax = max;

//            max = *(p + i);

//        } else if(secondMax < *(p + i) && *(p + i) != max){

//            secondMax = *(p + i);

//        }

//    }

//    printf("max = %d\nsecondMax = %d\n", max, secondMax);

    //5.求所有元素的和

    int sum = 0;

    for (int i = 0; i < 10; i++) {

        sum += *(p + i);

    }

    printf("sum = %d\n", sum);

    

    //----------------

//    int max = 0;

//    int secondMax = 0;

//    for (int i = 0; i < 10; i++) {

//        if (max < *(p + i)) {

//            secondMax = max;

//            max = *(p + i);

//        } else if (secondMax < *(p + i) && *(p + i) != max){

//            secondMax = *(p + i);

//        }

//    }

//    printf("max = %d\nsecondMax = %d\n", max, secondMax);

    //-----------------

    int max = 0;

    int secondMax = 0;

    for (int i = 0; i < 10; i++) {

        if (max < *(p + i)) {

            secondMax = max;

            max = *(p + i);

        } else if (secondMax < *(p + i) && *(p + i) != max){

            secondMax = *(p + i);

        }

    }

    printf("max = %d\nsecondMax = %d\n", max, secondMax);

     */

    /*

    int a[5] = {65536, 2, 3, 4, 5};

    // int 1.当操作内存空间时,一次性操作几个字节的空间大小. 2.当自增时,加一个单位,所增加的字节大小.

    int *p = a; //a本身就是地址,无需再取地址.

    printf("%d", *p);

     */

    /**

     *  比较 数组 和 指针变量

     1.空间大小.

     数组所占存储空间 = 数组元素个数 * 每个元素所占存储空间大小

     指针变量和操作系统位数有关,32位操作系统是4个字节;64位操作系统是8个字节.

     2.可变性.

     数组名代表数组的首地址,是一个常量地址,不可改变.

     指针变量本质上就是一个变量,可以重新赋值,指针赋值的过程叫做指针重指向.

     */

    /*

    //指针变量和字符数组(字符串)之间的关系.

    char str[] = "ac is a big company, yao shang shi";

    char *p = str; //指向字符串首地址.

    printf("%c\n", *(p + 6));

    //给定一个开始地址,一个字符一个字符的输出,直到遇到\0结束.

    *(p + 22) = '\0';

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

    //1.字符串长度

    unsigned long length = strlen(p);

    printf("%lu\n", length);

    //2.字符串拷贝

    //strcpy 返回目的字符串的地址.

    strcpy(p + 5, "Frank");

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

    //3.字符串比较

    printf("%d\n", strcmp(p + 1, "bb"));

     */

    /*

    //求字符串中空格的个数,用指针操作

    char str[] = "I love iOS";

    char *p = str;

    int count = 0; //存储空格个数

    int i = 0;

    while (*(p + i) != '\0') {

        if (*(p + i) == ' ') {

            count++;

        }

        i++;

    }

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

     */

    //p1 指向数组str,数组str在栈区,空间内容可以更改

    /*

    char str[] = "Frank is handsome";

    char *p1 = str;

    strcpy(p1, "Duck");

    //p2 指向的是常量字符串的首地址,处在常量区,常量区的内容不可更改

    char *p2 = "Frank is handsome";

    strcpy(p2, "Duck");

     */

    /*

    //1.指针要有明确指向.

    //2.要指向一个可控的区域.

    char *p = 0x7ffffff100;

    strcpy(p, "aaaa");

     */

    /*

    //指针数组

    char *str[3] = {"Frank", "Duck", "Kris"};

    printf("%s", str[2]);

    //升序排序

    for (int i = 0; i < 3 - 1; i++) {

        for (int j = 0; j < 3 - 1 - i; j++) {

            if (strcmp(str[j], str[j + 1]) > 0) {

                //交换,两个元素的值

                char *temp = str[j];

                str[j] = str[j + 1];

                str[j + 1] = temp;

            }

        }

    }

    for (int i = 0; i < 3; i++) {

        printf("%s\n",str[i]);

    }

     */

    



    

    



    return 0;

}


******************************************************************************************************************************************************************************************************


#import <Foundation/Foundation.h>


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

{

//    1、输入10个整数,将其中最小的数与第一个数对换,把最大的数和最后一个数对换,指针实现

    /*

    int a[10] = {0};

    int *p = a;

    int max = 0;

    int min = 1000000000;

    printf("输入十个数:\n");

    for (int i = 0; i < 10; i++) {

        scanf("%d", p + i);

    }

    for (int i = 0; i < 10; i++) {

        if (max < *(p + i)) {

            max = *(p + i);

        }

    }

    for (int i = 0; i < 10; i++) {

        if (max == *(p + i)) {

            int temp = *(p + i);

            *(p + i) = *(p + 9);

            *(p + 9) = temp;

        }

    }

    for (int i = 0; i < 10; i++) {

        if (min > *(p + i)) {

            min = *(p + i);

        }

    }

    for (int i = 0; i < 10; i++) {

        if (min == *(p + i)) {

            int temp = *(p + i);

            *(p + i) = *p;

            *p = temp;

        }

    }

    for (int i = 0; i < 10; i++) {

        printf("%d ", *(p + i));

    }

     */

//    有一字符串,包含数字与字母,编程去除数字。

//    1、要求在原字符串中操作

//    2、使用指针处理。

    char a[] ="aghk6545kj4kfsl4415kjhhf";

    char *p =a;

    int i = 0;

    while (*(p + i) != '\0') {

        int j = 0;

        while (*(p + i) < 57 && *(p + i) > 48) {

            if (*(p + i) > 48 && *(p + i) < 57) {

                strcpy(p + i, p + i + 1);

            }

            j++;

        }

        i++;

    }

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







    

    

    

    

    

    

    return 0;

}



0 0
原创粉丝点击