首页 > 技术文章 > C 语言指针

huyibo 2016-05-09 19:58 原文

//  main.m

#import <Foundation/Foundation.h>
#import "abc.h"




int main(int argc, const char * argv[]) {
    
    //指针:
    /*
     指针说白了就是地址.
     
    
    
    
    */
//    int a=20;//首先定义了一个 int 类型的变量a;
//    int *p=&a;//定义了一个int *类型的指针p,我们定义的指针p指向我们int 类型变量a的地址,(也就是把变量a的地址存储到指针p中);    *:取值运算符    &:取地址运算符
//    
//    printf("%d\n",*p);//这里是我们取出指针 p指向变量a地址里面的值(*-->  是取值运算符)
//     printf("%p\n",p);//这里是 我们取出指针p中存储的变量a的地址
//    
//    printf("%p\n",&a);//这里是打印出变量a所在的地址
//
    
    
    
    //注意:   *:取值运算符    &:取地址运算符
    //指针所在字节大小和类型无关之和操作系统有关系  (   操作系统分为32位操作系统和64位操作系统).
    
    //定义一个变量a  并给其赋值
//    int a =20;
//    printf("%p\n",&a);//打印出变量所在的地址
//    int b=10;//定义一个变量 b 并给其赋值
//    printf("%p\n",&b);//打印出变量b所在地址
//    
//    int *p=&a;//定义一个 int *类型的指针 p 指向我们变量a所在的地址
//    printf("%d\n",*p);//取出变量a所在地址中的值
//    
//    p = &b;//这句话的意思是我们的指针 p 又重新指向了 b的地址,里边存储的是变量b的地址
//    *p = 100;//通过地址就可以修改对应的值(间接修改)
//    printf("%d\n",*p);
//    printf("%d\n",b);
//    
//    
//    printf("指针*p所占字节的大小%lu\n",sizeof(p));
    
    
    
    
//    //定义一个char类型的变量
//    char c='a';
//    //定义一个char类此你给的指针
//    char *q=&c;
//    //打印c的地址
//    printf("&c=%p\n",&c);
//    printf("&c=%p\n",q);
//    
//    //打印变量c的值
//    printf("c=%c\n",c);
//    
//    //打印指针q指向的地址中对应的值
//    printf("c=%c\n",*q);
//    
//    
//    //使用指针q修改我们变量c的值
//    *q='a';
//    printf("c=%d\n",*q);
//    printf("指针*q所占字节大小:%lu\n ",sizeof(q));
    
//    //定义一个int 类型的变量 a;
//    int a=20;
//    //定义一个 int *类型的指针指向我们变量a的存储地址
//    int *p=&a;
//    
//    
//    
//    
//    int *q;//野指针,如果定义一个 指针没有给其赋初值或者是指向,这时候的指针就叫做 野指针(孤魂野鬼的意思),一定要避免野指针,因为其很容易使程序出现崩溃
//    printf("%d\n",*q);
//    
//    
//    int *w=NULL;//当定义指针的时候 我们不想让这个指针指向任何地址,我们可以给这个指针赋值NULL,    NULL的意思是代表空.....
//    
    
    /*
    //指针运算
    //指针只有加减 两种运算
    //首先我们定义一个int 类型的变量a
    int a=8;
    //定义一个指针p指向了变量a的地址
    int *p=&a;
    //打印变量a的地址
    printf("&a=%p\n",p);
    //打印变量a的值
    printf("a=%d\n",*p);
    
    //加法
    printf("a=%d\n",*p+1);//取出变量a的地址,并对其进行+1
    
    printf("p=%p\n",p);//打印出p的地址和我们变量a 的地址相同,并没有改变地址,改变的只是值(内部的值);
    
    printf("p=%p\n",p+1);//向高位移动四个字节
    
    
    printf("---------------\n");
    
    
    char b='c';
    char *q=&b;
    printf("&b=%p\n",q);
    printf("b=%c\n",*q);
    printf("q+1=%p\n",q+1);//想高位移动一个字节
    
    printf("---------------\n");

    
    int *r=NULL;
    printf("r=%p\n",r);
    printf("r+1=%p\n",r+1);
    //由此我们可以看出指针移动的字节大小和我们类型有关系
    */
    
    
    
    //减法
    //首先定义一个int类型的变量
//    int a=6;
//    //定义一个指针p;
//    int *p=&a;
//    
////   // p=1;      //这里的p代表的是地址,而1 代表的是我们的整形变量,爆黄是因为类型不匹配
////    p=p+1;//代表的是:这里的p指的是地址,代表的在是我们p地址的基础上向高位移动4个字节
////    printf("%d\n",*p);
////    
////    
//    printf("&a=%p\n",p);//打印变量a的地址
//    //打印变量a的值
//    printf("a=%d\n",*p);
//    printf("%d\n",*p-1);
//    printf("p-1=%p\n",p-1);//代表的是向低位移动四个字节
//    
    
    
//    //指针与数组的关系:
//    int arr[]={2,4,6,8,9};
////    printf("arr=%p\n",arr);
////    
//    int *p=arr;
//    printf("p=%p\n",p);
//    //由此可以得知我们的数组名就是我们首地址
//    printf("%d\n",*p);//这里取出的是我们数组首地址中下标为0的元素也就是2;
//    printf("%d\n",*p+1);//取出2之后对其进行+1操作
//    printf("%d\n",*(p+1));//取出下标为1的元素
//    
//    
//    arr[0]=10;
//    printf("%d\n",arr[0]);
//    for (int i=0; i<5; i++) {
//        printf("%d ",arr[i]);
//    }
//    
//    printf("\n");
//    //通过指针找出对应下标代表的元素并进行修改
//    *(p+3)=20;
//    
//    printf("%d\n",arr[0]);
//    for (int i=0; i<5; i++) {
//        printf("%d ",arr[i]);
//    }
//    
//    printf("\n");
//    
//    //打印数组所占字节大小
//    
//    printf("arr =%lu\n",sizeof(arr));//数组所占自己多少和我们操作系统无关,和我们元素个数以及其对应的类型有关,数组名是常量地址,不能重指向(也不能赋值);
//    
    
    
  
//    int arr[2][3]={1,2,3,4,5,6};
//   
//    int *p=&arr[0][2];
//    printf("%d\n",*p);
//    
//    
//    //指针与字符串
//    char string[]="iphone";
//    printf("string=%lu\n",sizeof(string));
//    printf("string=%p\n",string);
//    char *p=string;
//    printf("p=%p\n",p);
//    printf("string=%c\n",*p);
//    printf("string=%c\n",*(p+1));//取出我们字符串中的元素
//    
//    
//    *(p+1)='v';//修改字符串中的元素
//    printf("string=%s\n",string);
//    
    
    //编程实现,通过指针计算字符串的长度;
//    char str1[]="iphone";
//    int count=0;//用来计数
//    char *p=str1;
//    while (*(p+count)!='\0') {
//        count++;
//    }printf("%d\n",count);
//    
    
   // 指针与数组
//    char *str[3]={"ios","iphone","imac"};//字符串指针数组
//    
//    printf("str=%s\n",*str);
////
////    printf("str=%c\n",*(str+2)[0]);//iphone//为什么取"iphone的p会崩溃
////    
////    
////    
//    printf("str=%s\n",str[0]);
//    
//    printf("ios=%c\n",*str[0]);
//    
//    //取ios的o
//    printf("ios=%c\n",*(*str+2));//????
//printf("str=%c\n",*(*(str+1)+1));//"iphone"中的p
//    
//   printf("str=%c\n",*(*(str+2)+1));//"imac"中的m
    
    
    
//    char *str[3]={"ipad","iphone6s","INM"};
//    //取出ipad
//    printf("str=%s\n",*str);
//    printf("str=%s\n",*(str+1));
//    printf("str=%s\n",*(str+2));
////取出ipad的p
//    printf("str=%c\n",*(*str+1));
//    
//    printf("str=%c\n",*(*(str+1)+6));
//    
//    *str="fgf";
//    printf("str=%s\n",*str);
//    //常量区的东西是不可以被修改,只能看不能碰
//    *(*str+1)='t';
//    printf("str=%c\n",*(*str+1));
//    
//
    
    //首先定义两个变量a b实现的是两个值得交换(使用函数);
    
    
    int a=10;int b=20;
    cd(&a,&b);
    printf("a=%d\n,b=%d\n",a,b);
  
    
    return 0;
}

 

推荐阅读