zoukankan      html  css  js  c++  java
  • iOS指针第一天

    //
    //  main.m
    //  LessionPointer
    //
    //  Created by laouhn on 15/7/24.
    //  Copyright (c) 2015年 池海涛. All rights reserved.
    //
    
    #import <Foundation/Foundation.h>
    void jiaohuan(int *a,int *b)
    {
        *a = *a^*b;
        *b = *a^*b;
        *a = *a^*b;
    }
    int main(int argc, const char * argv[]) {
        //指针变量 :存储地址的变量
        /**
         *  指针定义时,数据类型的作用,告诉系统我是一个什么类型的指针
            //指针变量定义时,数据类型的作用(以 int 为例)
              1.告诉系统我是一个 int 类型的指针
              2.在指针运算是,每次偏移的字节数 int -4 个字节
              3.指针控制的字节数,int 控制 4 个字节
         
         */
        /**
         int a = 10;
         int *p = NULL;//指针变量p
         char *q = NULL; //指针q 的数据类型是: char *;
         //平时我们所说的指针,其实就是指针变量,指针中存储的是地址
         
         //指针变量中地址的输出
         printf("%p
    ", p);
         //指针变量所占字节数:只与系统操作系统位数有关,32操作系统 4个字节,64位操作系统8个字节
         printf("p = %lu
    ", sizeof(p));
         printf("q = %lu
    ", sizeof(q));
         
         //取址运算符: &
         p = &a;
         printf("%p
    ",p);
         printf("%p
    ", &a);
         //取值运算符 *
         //printf("%d
    ",*p);
         
         
         
         //指针变量的赋值:指针重指向,就是对指针变量重新复制的过程.
         
         //指针运算:只有加减运算.
         printf("%d
    ",*(p+1));
         printf("%p
    ",p+1);
         
         printf("q+1之后输出的结果%d
    ",*(q + 1));
         */
    //    int a = 10;
    //    int *p = &a;
    //    *p = 30;
    //    //*p 在等号左侧是,是对p中存储的地址进行赋值操作,否则是取值操作
    //    //int *p = NULL;在定义时*p的作用 高数系统定义的是指针变量.
    //    printf("%d
    ", a);
        //指针与数组
        /**
         *  
         
         int a[] = {9, 5, 2, 7};
         //数组名是数组首地址,但是数组名是一个常量地址
         printf("%p
    ",a);
         
         printf("%p
    ",&a[0]);
         
         
         
         int *p = a;
         
         printf("%d
    ",*p);
         //指针偏移给指针类型有关
         printf("%d
    ", *(p + 1));
         
         printf("%d
    ",p[1]);
         
         printf("%d
    ", *(p + 1 + 1));
         
         printf("%d
    ", *(p + 1 + 1 + 1));
         
         
         printf("%d
    ",*a);
         printf("%d
    ", *(a+1));
         printf("%-----d
    ",a[1]);
         
         int b[] = {3, 8, 4, 9};
         p = b;//指针重指向
         //a = b;a是一个常量,不能被赋值,而指针式一个变量,可以重指向(重新赋值).
         //数组类型,与指针类型不匹配,会出现什么问题?
         
         int b[] = {256, 5, 2, 7};
         int *p = b;
         for (int i = 0; i < 4; i++) {
         printf("%d", *(p + i));
         }
         
         //printf("%d
    ",*(q + 1));
         
         char str[] = "iPhone";
         char *p = str;
         //通过指针输出字符串
         printf("%s
    ",p);
         //把h 改成 H,直接通过地址对里面的值进行修改
        是取值运算符
         *(p + 2) -= 32;
         printf("%s
    ", p);
         
         //此种情况,q中存储的是,常量区的地址,而常量区的内容,不允许被修改.切记!!(alt shift +k)
         char *q = "iPhone";
         (q + 2) = 'H';
         
         printf("q 的地址 %p
    ",q);
         
         
         //通过指针计算字符串的长度.
         char str[] = "iPhone";
         int i =0;
         char *p = str;
         while (*(p + i) != 0 ) {
         i++;
         }
         printf("%d",i);
         
         */
        //字符串数组
        //char strArray[][20] = {"iPhone", "iPod", "iPad", "iWatch"};
        
      //  printf("%s
    ",strArray[0]);
        //指针数组,里面存得是地址
    //    char *str[] = {"iPhone", "iPod", "iPad", "iWatch"};
    //    
    //    printf("++++%lu",sizeof(str));
    //    for (int i = 0; i < 4 ; i++) {
    //        //printf("%p ",str[i]);
    //        printf("%s ",str[i]);
    //    }
    //    printf("
    ");
        //printf("%p
    ",&str[0]);
        //char p[]  = "ddddd";
        //将上述指针数组,升序排序
        //str[0]  存储的是iPhone的首地址
        //str[1]  存的是iPod 的首地址
        //str[2] 存的是ipad 的首地址
        //str[3] 存的是iWatch的首地址
        /**
         *  
         
         for (int i = 0; i < 4 -1; i++) {
         for (int j = 0; j < 4 - 1 -i; j++) {
         if ( strcmp(str[j],str[j+1])>0) {
         
         // *(p + 2) p[2]
         //比较的是 内容,交换的是数组中的地址的位置
         char *temp =str[j];
         str[j] = str[j + 1];
         str[j + 1] = temp;
         }
         
         }
         }
         
         for (int i = 0; i < 4; i++) {
         //printf("%p ",str[i]); //输出数组中的元素
         printf("%s ",str[i]);//输出数组元素,对应地址上的内容
         }
         //字符串数组
         char str[4][20] = {"iPhone", "iPod", "iPad", "iWatch"};
         
         //指针数组,该指针数组存储的是栈区空间地址
         char *strArray[4] = {str[0], str[1], str[2], str[3]};
         for (int i = 0; i < 4;i++) {
         printf("%p ", strArray[i]);
         }
         printf("
    ");
    
          //指针数组,该指针数组存储的是常量空间的地址
       
        char *str1[4] = {"iPhone", "iPod", "iPad", "iWatch"};
        for (int i = 0; i < 4;i++) {
            printf("%p ", str1[i]);
        }
         */
        //指针与函数
        int a = 5;
        int b = 6;
        jiaohuan(&a,&b);
        printf("a=%d,b=%d",a,b);
        return 0;
    }
  • 相关阅读:
    JS数组存储(两个数组相等,一个改变,另一个跟着改变)
    图片404加载失败后如何处理
    为什么重写equals方法,还必须要重写hashcode方法
    Java中HashMap和TreeMap的区别深入理解
    java中String数组和List的互相转化
    log4j重复打印的解决方法
    mysql 允许在唯一索引的字段中出现多个null值
    elasticsearch 常见查询及聚合的JAVA API
    A记录(主机名解析)、CNAME(别名解析)和URL转发(域名转发)
    域名解析中的cname解析和显性URL跳转和隐性URL跳转三者有什么区别
  • 原文地址:https://www.cnblogs.com/wohaoxue/p/4674422.html
Copyright © 2011-2022 走看看