ios c语言学习第八天 ---指针

    //数组当参数时传递的不是整个数组
   
//传递就是数组元素的首地址(就是传递了指针)
   
//printf("%lu"),sizeof(array);

   字节是内存当中最小的存储单位
    一个字节是8个二进制位
   
   访问变量:
    1.直接访问:通过变量名直接访问
    2.间接访问:通过变量的地址(内存编号)间接访问变量
   
   指针变量
    int *p = NULL;
    声明指针的时候 *没有特殊意义只是告诉编译器这是一个指针变量
    int : 表示这个指针变量所指向的内存区域是一个整形存储区域也就是说指针变量p指向的内存区域里面存储的值是一个整形
   
   int a = 5;
    声明一个指针变量
    int *p = NULL;
    指针变量 p指向 a的存储区域(地址)
    &取地址符
    &a 取出变量a的地址
    p = &a;
   打印地址的占位符 %p
    printf("%p\n",p);
    printf("%p\n",&a);
   
   
   * 取值符
    *p表示指针变量p所指向的地址里面所保存的值
    printf("%d\n",a);
    通过指针变量p来打印
    printf("%d\n",*p);
   
   修改变量a的值
    a = 3; //直接访问
   *p = 30; //间接访问
    printf("%d\n",*p);
    打印指针变量占用字节数
    指针变量占用8个字节不管什么数据类型只跟操作系统有关
    printf("%lu\n",sizeof(p));//sizeof函数是计算指针所占的字节数
   
   
    int a = 5;
    int *p = &a;
    int b = 3;
    p = &b;//指针变量的赋值相当于指针的重指向
   printf("%d\n",*p);
   
   
   习题一
    int num1 = 50;
    int num2 = 40;
    int *p = &num1;
    int *q = &num2;
    q = p;
    *q = 100;
    printf("num1 : %d\n",num1);//100
    printf("num2 : %d\n",num2);//40
    printf("p:%p\n",p);
    printf("q:%p\n",q);//p1 p2地址一样
    printf("*p:%d\n",*p);//100
    printf("*q:%d\n",*q);//100
   
   
   
   指针的运算
    地址里面的值可以加减乘除
    地址的运算只有
    地址加1要看指针变量的数据类型:
    如果 int类型地址加1相当于4个字节
    如果 char类型地址加1相当于1个字节
    int a = 3;
    int *p = &a;
    printf("%p\n",p);
    p++;
    printf("%p\n",p);
   
    int a = 3;
    int b = 5;
    int *p = &a;
    //系统在分配变量的内存时不一定分配的是连续的
    //如果是数组 分配的一定是连续的存储区域
    printf("%p\n",&a);
    printf("%p\n",&b);
    printf("%d\n",*p);
    p--;//因为指针p指向int类型的a;指针减1就相当于地址减4
    printf("%d\n",*p);
   
    //需求:编写一个函数通过指针交换两个变量的值
    int a = 3;
    int b = 5;
    printf("%p\n",&a);
    printf("%p\n",&b);
    //指针在参数的传递是实参向形参进行的传递是一个拷贝的过程 是一个值的传递地址不一样
    //交换本着一个原则操作的变量的地址应该是一致的
    Change(&a, &b);
   //函数名为Change的函数 
   void Change(int *a,int *b){
        int temp = *a;
        *a = *b;
        *b = temp;
   }
    printf("a = %d\n",a);
    printf("b = %d\n",b);
    printf("%p\n",&a);
    printf("%p\n",&b);
     
    //指针与数组
    int array[4] = {1, 3, 5, 7};
    printf("%p\n",&array[0]);
    printf("%p\n",array);
    //声明一个指针变量指向数组(数组的首元素)
    //数组的名字本身就是数组首元素的地址不需要加取地址符
    int *p = array;
    printf("*p = %d\n",*p);//1
    printf("*(p + 1) = %d\n",*(p + 1));//3
    printf("%d \n",array[2]);//5
    printf("*(p + 2) = %d\n",*(p + 2));//5
    printf("%d\n",p[2]);//5
    printf("%d\n",*(array + 2));//5
    //取出数组中的元素方法
   array[下标]
    //*(array +下标)
   
//利用指针变量p取出数组元素
   //p[下标]
   *(p + 下标)
   
   
   计算数组当中元素的个数
   数组中总的元素的字节数 /数组中单个元素的字节数数组元素个数
    int count = sizeof(array) / sizeof(array[0]);
   
   通过指针变量p不能求出来数组元素个数
    指针变量占8字节只跟操作系统有关
   
   int count = sizeof(p);
    printf("%d",count);
   
   //指针与字符串
    char str1[] = "iphone";
    //声明一个指针指向str1
    char *p = str1;
    //1.利用指针打印字符串
    printf("%s\n",str1);
    printf("%s\n",p);
    //2.利用指针打印字符 h
    printf("%c\n",str1[2]);
    printf("%c\n",*(p + 2));
    printf("%c\n",p[2]);
    printf("%c\n",*(str1 + 2));
    //h更改成 w
    str1[2] = ‘w';
    printf("%s\n",str1);

    //通过指针来计算字符串的长度
    char str[] = "wanglong";
    //声明一个指针指向字符串str
    char *p = str;
    int count = 0;//保存长度
    // 思路:第一位 *p + 0);
    //思路:第二位 *p + 1);
    //思路:第三位 *p + 2);
    //思路:第四位 *p + 3);
    // *p + i== '\0'字符串结束了
    while (*p != '\0') {
        p++;
        count++;
    }
    printf("%d\n",count);
   
   
//"iphone"常量字符串
   
    char stu1[] = "ios";
    char stu2[] = "Android";
    char stu3[] = "Win";  
    char *strings[3] = {"iOS", "Android", "Win8"};
    //指针数组数组中保存的都是同一个类型的数据指针数组中保存的都是指针类型保存的都是地址
    printf("%s\n",strings[0]);
    printf("%s\n",*strings);
    printf("%s\n",*(strings + 1));
    printf("%c\n",*strings[0]);
    *strings[0] = 'x';
    printf("%c\n",*strings[0]);
   
    strings[0] = "sos";
    printf("%s\n",*strings);
   
   
//如果你声明时声明的是常量字符串那么你是不能更改的 如果你声明时先声明一个字符串(这时这个字符串是从常量区拷贝拷贝栈区)这时候你可以对字符串进行修改
   

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值