• C语言--指针(一)




    #import <Foundation/Foundation.h>
    //交换函数
    void swap(int x, int y)
    {
        printf("x=%d,y=%d",x,y);
        int temp = 0;
        temp = x;
        x = y;
        y = temp;
        printf("x=%d,y=%d",x,y);
        
        
    }
    
    //
    void swap2(int *x , int *y)
    {
        //不改地址,改地址相应的值
        printf("x=%d,y=%d",*x,*y);
        int temp = 0;
        temp = *x;
        *x = *y;
        *y = temp;
        printf("x=%d,y=%d",*x,*y);
    }
    
    int main(int argc, const char * argv[])
    {
        
        
        //C语言定义指针的时候,喜欢使用p,q,r等;
        //类型是int*
        //变量名p
        //初值NULL恒等于0
    //    int *p = NULL;
    //    //打印指针%p
    //    printf("%p %lu
    ",p,sizeof(p));
    //    
    //    char *q = 0*1000;
    //    printf("%p %lu
     ",q,sizeof(q));
        
        
    #pragma mark---------指针总结
        //我们通常所说的指针,指的是指针变量,
        //指针变量是存放, 内存地址 (内存编号)的变量.
        
        //32位,8个0或1表示每8位一个字节
        //指针占用的内存都一样,指针变量占用的内存不一样
        
        //p和q所占内存一样,由于都是32或64位系统下的首地址,都占那么多,而int,char决定长度不一样,int占四间房,char就占1间房
        
        //取地址符,是知道int a = 3,a值是3, int *P想指向内存中a = 3,这时候有了取地址符&a,就是a的首地址,
    //    int a = 3;
    //    int *p = &a;
    //    printf("p=%p
    ",p);
    //    printf("&a=%p
    ",&a);
    ////    printf("%d",*p);
    //    
    //    char b = 'a';
    //    char *q = &b;
    //    printf("%p %lu
    ",q,sizeof(q));
        //整型等于整型地址,字符型等于字符型地址
        //没有谁是猜的地址,&取地址符,去整型,就是整型指针....
        
        //*p 取值符 地址里存放的内容
        //取多少字节取决于类型修饰符
    //    printf("%d 
    ",*p);//*p 取值运算符  用于获取 指针相应的值
    //    printf("%d %c
    ",*p,*q);
        
        
        //获取地址两种途径
        //第一,直接给地址
        //第二,用取值符号&来取
    #pragma mark-------------指针变量的赋值,代表指针变量的重指向
        //指针变量指向
        //指针变量的赋值,代表指针变量的重指向
        //注意
        //不要让整型指向字符型
        //也不要让字符型指向整型
    //    p = &b;错误
        
        
        
    //    int a = 10;
    //    int *p = &a;
    //    printf("指针p存放的地址: %p 指针p占用的内存空间大小:%lu 这个内存空间里存放的值: %d
    ",p,sizeof(p),*p);
    //    //p自己也占内存
    //    //它们都放在栈区,一个一个分配内存
    //    printf("p自己的地址: %p
    ",&p);
    //    int b = 20;
    //    p = &b;
    //    printf("指针p保存的新地址:%p 新的内存空间里存放的值 %d
    ",p,*p);
        
    #pragma mark-------------指针的算术运算
        //唯独加减运算
        //int * p = &a;
        //P++;向高位移动四个字节
        //p--;向低位移动4个字节
        
        //p每加一代表加了这么大类型
        //p++//向高位移动四个字节
        //p+1//没有变
        //*(p++)
        //*(p+1)
        
        //int * p = &a;只告诉编辑器 p是一个指针
        
        //*p = 20;操作符,取地址相应的值
        
        //p 指针(地址) *p取值 &p地址 &(*P)地址
        
    #pragma mark-------------数组与指针
    //    int arr[5]={9,2,3,4,5};
    //    printf("%p
    ",arr);
    //    printf("%p
    ",&arr[0]);
    //    int *p = arr;
    //    printf("%d
    ",*p);
    //    printf("%d
    ",*(p+1));
    //    printf("---%d
    ",p[1]);
    //    arr[1]=8;//直接改值
    //    *(p+1)=7;//间接改值
    //    printf("%d
    ",*(p+1));
    #pragma mark-------------数组去*号加[]原则,把数字扩出来
    //    printf("%d
    ",*(p+1));
    //    printf("%d
    ",p[1]);
        
        //p[2] *(p+2) arr[2]
    //    p=arr+3;//指针变量是变量,能够重指向(赋值)
        //arr = p;数组名是一个常量指针,不能够改变赋值.
        
        //通过数组元素求数组元素个数,sizeof(a)/4
    
        
    //    short a[4]={3,7,9,1};
    //    int  *p1 = a;
    //    char *p2 = a;
    //    printf("%d",*p1);
    //    printf("%d",*p2);
        
    #pragma mark-------------字符串与指针
        //能够操作单个字符,     *(p+2)='z';
        //也能够操作整个字符串   printf("%s",(p+2));
    //    char str[]="iPhone";
    //    char* p = str;
    //    *(p+2)='z';
    //    printf("%s",(p+2));
    #pragma mark-------------指针数组
        //存放指针的数组是指针数组
        //常量区
        //栈区.拷贝常量区
        
    //    char *p1 = "iPhone";
    //    char *p2 = "Android";
    //    char *p3 = "win8";
    //    char *strings[3]={p1,p2,p3};
        
        // char *strings[3]={"iphone","Android","win8"};
        //操作整个字符串
        //打印指针数组(指针字符串)
    //    for (int i = 0; i<3; i++) {
    //        printf("%s ",strings[i]);
    //    }
    //    printf("%s,%s,%s",strings[0],strings[1],strings[2]);
        //操作单个字符串
    //    *(strings[1]+4) = 'x';//指向常量,不能赋值
    //    char c = *(strings[1]+4);
    //    printf("
     %c",*(strings[1]+4));
    //    printf("
     %c",strings[1][4]);
        //
        
    #pragma mark-------------指针与函数
        //改变不了值,由于是你压根没有改变a,b,而是改变它的副本x,y
        int a = 10,b = 20;
    //    swap(a, b);
    //    printf("%d,%d",a,b);
    //    int *p = &a;
    //    int *q = &b;
    //    swap2(p, q);
        //不改地址,改地址相应的值
        swap2(&a, &b);
        printf("a=%d,b=%d",a,b);
        //学好指针,须要多绘图
        
        
    
        return 0;
    }
    
    


  • 相关阅读:
    【转载】C#中List集合使用Contains方法判断是否包含某个对象
    【转载】C#中List集合使用Clear方法清空集合
    【转载】C#中List集合使用AddRange方法将一个集合加入到指定集合末尾
    【转载】C#中List集合使用Min()方法查找到最小值
    【转载】 C#中List集合使用OrderByDescending方法对集合进行倒序排序
    Mysql,ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'mysql'
    Android -- MeasureSpec
    Android -- PullToRefresh应用
    Android -- Gradle
    Android -- ShortCut
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7084629.html
Copyright © 2020-2023  润新知