指针

 
指针----------指针就是地址
数据访问的两种形式:1直接访问2间接访问
地址:内存单元的编号 64位二进制
数据类型:基本数据类型 构造类型 指针类型 void类型
指针变量:指针在定义变量的过程中是一种数据类型,但在开发过程中指针是地址
指针变量 所占字节值与操作系统有关
int *中间虽然有空格 但他是整型指针类型
32位操作系统 指针变量都占4个字节
64位操作系统 指针变量都占8个字节//-fno-odjc-arc
指针可以跨作用域修改值
NULL 一般作为指针的初始值 恒等于零;
取址运算符:&取址运算符 可以取出变量的地址 用%p可以打印地址
取值运算符:*取值运算符 可以取出变量(地址)的值
int *或char *是一个整体 表示是整型的指针或char型的指针 也就是说前面有类型标识符 ,*就不是取值运算符
指针的算术运算:指针的算术运算只有加减,指针的类型决定他移动几个字节
1,加的话是往高位移动
2,减的话是往低位移动
偏移量
指针的重指向:指针变量可以赋值 赋值的话 指针就指向了另一块区域(相同类型,不同类型的话不匹配)
数组:用连续的内存空间 存储数据的构造类型
数组名:数组元素首地址
1   int *p = arr;
2  int *p1 = &arr[0];//1=2
*p + 1;     此时先取的arr[0]值 然后把值加1
*(p + 1);   此时取的是arr[1]
*(p+1)=6-------*(p+i) 等价于 p[i];
指针与数组的不同
1 所占内存空间不同,指针所占内存空间只与操作系统有关,而数组是由数组元素个数 和数组中的元素类型决定的
2 数组名是一个常量,指针是一个变量
字符数组元素的首地址 也恒等于数组名
指针数组 数组元素都是指针
数组的长度:
printf("%lu\n",sizeof(arr));(注意\0)
数组元素个数:
int count;
count = sizeof(arr)/sizeof(int);
1.printf(“%d\n”,count);
    char name[10] = "liubei";
    printf("%p\n",&name[0]);
    printf("%p\n",name);
    //我们可以通过取值符操作单个字符
    printf("%c\n",*(name+1));
    //*(name + i); 等价于 name[i];
    printf("%lu\n",sizeof(name));
    int count = 0;
    char *p = name;
    while (*p != '\0') {
        count++;
        p++;
    }
    printf("%d\n",count);
2.
char *strings[3] = {"ios","android","win8"};
    for (int i = 0; i < 3; i++) {
        printf("%p\n",(strings + i));
    }
注意:(strings + i) 等价于 strings[i];
指针代码:
#import <Foundation/Foundation.h>
void swap(int *pa,int *pb);
void swap(int *pa,int *pb){
    int temp = *pa;
    *pa = *pb;
    *pb = temp;
    printf("%d %d\n",*pa,*pb);
}
int Swap(int a,int b);
int Swap(int a,int b){
    a = a ^ b;
    b = a ^ b;
    a = a ^ b;
    return a;
    return b;
}
int main(int argc, const char * argv[]) {
    int a = 3;
    int b = 4;
    swap(&a, &b);
//    void *p = NULL;
//    int *p1 = NULL;
//    printf("%p\n",p1);
//    int *pp = 3;
//    printf("%lu\n",sizeof(pp));
//    printf("%p\n",pp);
//    char *p2 = NULL;
//    float *p3 = NULL;
//    printf("%p\n",p1);
//    printf("%p\n",p2);
//    printf("%p\n",p3);
//    取址运算符&
//    int a = 3;
//    int  *pa = &a;
//    //地址是十六位的十六进制数
//    printf("%p\n",pa);//地址:0x7fff5fbff7bc
//  
//    printf("%d\n",*pa);//数值:3
//    int b = 5;
//    int *pb = &b;
//    printf("%p\n",pb);
//    printf("%d\n",*pb);
//    char c = 7;
//    char *pc = &c;
//    printf("%p\n",pc);
//    printf("%d\n",*pc);
//    float d = 8;
//    float *pd = &d;
//    printf("%p\n",pd);
//    printf("%f\n",*pd);
//   int *pd = 0x7fff5fbff78c;不直接给指针变量赋值地址
//    int a = 3;
//    int *pa = &a;
//    printf("%p\n",pa++);//加4
//    printf("%p\n",pa--);//减4
//    printf("%p\n",pa);
//    for (int i = 0; i < 5; i++) {
//        printf("%p\n",(pa + i));
//    }
//    float b = 6;
//    float *pb = &b;
//    printf("%p\n",pb++);
//    for (int i = 0; i < 6; i++) {
//        printf("%p\n",(pb + i));
//    }
//    char c = 7;
//    char *pc = &c;
//    printf("%p\n",pc--);
//    for (int i = 0; i < 6; i++) {
//        printf("%p\n",(pc - i));
//    }
//    int a = 3;
//    int *pa = &a;
//    char c = 'm';
//    pa = &c;//不建议,不匹配的类型
//    printf("%d\n",*pa);
//    int b = 5;
//    int *pb = &b;
//    pa = &b;
//    printf("%d\n",*pa);
//    int d = 8;
//    int *pd = &d;
//    pd = &d;
//    printf("%d\n",*pd);
//    printf("%p\n",pd);
//    int arr[3] = {2,5,0};
//    for (int i = 0; i < 3; i++) {
//        printf("%p\n",&arr[i]);
//    }
//    printf("%p\n",arr);
//    printf("%p\n",arr[0]);
//    char name1[] = {'z','h','u'};
//     count = sizeof(arr)/sizeof(int);
    char name[10] = "liubei";
    printf("%p\n",&name[0]);
    printf("%p\n",name);
    //我们可以通过取值符操作单个字符
    printf("%c\n",*(name+1));
    //*(name + i); 等价于 name[i];
    printf("%lu\n",sizeof(name));
    int count = 0;
    char *p = name;
    while (*p != '\0') {
        count++;
        p++;
    }
    printf("%d\n",count);
    char *strings[3] = {"ios","android","win8"};
    for (int i = 0; i < 3; i++) {
        printf("%p\n",(strings + i));
    }
    //(strings + i) 等价于 strings[i];
  //xxxxxxxx  int *number[5] = {1,2,3,4,5};xxxxxxxxx
//    for (int i = 0; i < 5; i++) {xxxxxxxxxxxx
//        printf("%p\n",(number + i));xxxxxxxxxxxxxxxxxxxxxx
//    }//xxxxxxxxxxxxxxxx  
//    int x = 3;
//    int y = 5;
//    //函数运行过程中,形参是拷贝了实参的值 实参不会改变
//    swap(x, y );
//    printf("%d %d\n",x,y);
 
 
 
 
 
 
作业:  
char arr[3][20] = {"liubei","zhangfei","guanyu"};
   
    char *p[3] = {};
    for (int i = 0; i < 3; i++) {
        p[i] = arr[i];
    }
    for (int i = 0; i < 3 - 1; i++) {
        for (int  j = 0; j < 3 - 1 - i; j++) {
            if (strcmp(p[j], p[j+1]) > 0) {
                char *temp = p[j];
                p[j] = p[j+1];
                p[j+1] = temp;
            }
        }
    }
    for (int i = 0; i < 3; i++) {
        printf("%s\n",p[i]);
    }

转载于:https://www.cnblogs.com/sharkHZ/p/4984222.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值