zoukankan      html  css  js  c++  java
  • 四、指针的使用

    1.指针赋值
    int i , *p , *q;
    p = &i;//p获取i的地址
    q = p;//指针变量p把地址拷贝给指针变量q
    *p = 1;//改变i的值为1
    *q = 2;//改变i的值为2
    int i , j , *p , *q;
    p = &i;//指针变量i获取i的地址
    q = &j;//指针变量q获取j的地址
    i = 1;//给i赋值为1
    *q = *p;//把指针p的值拷贝给指针q
    printf(“%d %d ”,*p,*q);//输出
    2.指针与一维数组
    ①数组名代表数组的首地址,是一个地址常量,即数组首元素地址
    示例:
    void printfMaxValueOfArray(int array[] , int count);
    void printfMaxValueOfArray(int array[] , int count){
         int max = 0;
           for(int i = 0 ; i < count ; i ++){
              if(max < array[i]){
                   max = array[i];
              }
         }
         printf(“max = %d”,max);
    }
    int main(){
         int number[] = {10,20,15,3,8,9,100};
         printfMaxValueOfArray(number,sizeof(number) / sizeof(number[0]));
    }
    ②数组作为函数参数的时候,其实传递给函数的数组的首地址
    示例:
    void printfArray(int *arr , int count);
    void printfArray(int *arr , int count){
         for(int i = 0 ; i < count ; i ++){
              printf(“%d ”,arr[i]);
         }
    }
    int main(){
         int number[] = {10,20,15,3,8,9,100};
         printfArray(number,sizeof(number) / sizeof(number[0]));
    }
    ③数组名不能被改变
    ④语法糖:array[n]: *(array + n)
    ⑤数组作为返回值会有风险
    示例:
    char *backString(){
         char str[] = “Lanou”;
         return str;
    }
    问题在于str的生命周期只在花括号,主函数中调取时,已经获取首地址。执行完,内存即被释放,获取的首地址调用的是其他的内容。
    3.指针与二维数组
    4.指针与字符串
    ①指针与字符串类似于指针与数组的概念
    ②字符指针可以操作单个字符,也可以操作整个字符串
    ③%s格式控制符的作用:printf函数的格式串中如果包含%s格式控制符,择需要对应一个指针,函数内部会循环对指针做移位运算来得到每一个字符,直到遇到字符串的结束标识符’’结束。
    ④字符串与字符数组的区别是差一个’'
    示例:
    char strArray[] = “iPhone6”;
    //strArray[6] = ‘7’;
    char *s = strArray;
    *s = ‘o’;//s[0] = ‘o’;
    printf(“%s ”,s);
    ⑤使用sizeof计算字符串长度
    示例:
    char sa[] = “iPhone”;
    char *st = “iPhone”;
    //如果对数组名sizeof,返回值就是所有数组元素所占字节数
    printf(“%ld ”,sizeof(sa));
    //如果对指针sizeof,返回值就是指针所占字节数(8个字节)
    printf(“%ld ”,sizeof(st));
    ⑥注意存储位置
    《1》iPhone是常量字符串,存放在常量区(不可改)
    《2》str是字符数组,存放在栈区(可改)
    char *str = “iPhone6”;//只读,地址直接指向常量区,不可改
    示例:
    修改字符数组中的字符
    void test(char *str , int count);
    void test(char *str , int count){
         int number = 0;
         while(*str != ‘’){
              if(*str == ‘a’){
                   *str = ‘A’;
                   number ++;
              }
              str ++;//指针++,一次移动一个类型那么长的距离
         }     
    }
    5.指针与字符串数组
    6.指针与结构体
    ①指向结构体变量的指针,称为结构体指针
    typedef struct person{
         char name[20];
         int age;
    }person;
    int main(){
         person p1 = {“贝爷”,30};
         person *ps = &p1;
         ps->age = 40;
         //使用指针获取结构体变量中的成员变量
         (*ps).age = 35;//注意运算符的优先级
         printf(“%d ”,(*ps).age);
         strcpy(ps->name , “Liuwa”);
         printf(“%s ”,ps->name);
    }
    ②语法糖:(*ps).name: ps->name(高级用法)
    ③ps是结构体指针,存放结构体变量第一个成员的地址
    ④*ps是整个结构变量
    7.指针与结构体数组
    //结构体数组
    person pArr[3] = {{“A”,10},{“B”,20},{“C”,30}};
    for(int i = 0 ; i < 3 ; i ++){
         printf(“%s %d ”,pArr[i].name,pArr[i].age);
    }
    //结构体指针
    person *pas = pArr;
    for(int i = 0 , i < 3 ; i ++){
         printf(“%s %d ”,pas[i].name,pas[i].age);
    }
    for(int i = 0 ; i < 3 ; i ++){
         printf(“%s %d ”,(pas + i)->name,(pas + i)->age);
    }
    ①语法糖:(pas + i)->age:pas[i].age(高级用法)
    8.指针与函数
    ①使用指针作为函数,可以实现在函数内部改变函数外部变量的值
    ②函数传参的过程:把实际参数的值拷贝到形式参数
    ③注意传值和传址
    示例:
    交换a和b的值
    void swap(int *x , int *y);
    void swap(int *x , int *y){
         int temp = *x;
         *x = *y;
         *y = temp;
    }
    int main(){
         int a = 10 , b = 8;
         swap(&a,&b);
         printf(“a = %d , b = %d ”,a,b);
    }
    ④函数
    返回:int float double 算数居多
    返回:BOOL 判断状态
    返回:指针 分配内存或者操作内存
    返回:字符串 char *
    ⑤参数的作用
    《1》提供数据
    《2》参数 + 指针 = 返回多个结果
    《3》指针作为参数返回多个结果
    示例:
    void back(int *n1 , int *n2){
         *n1 = 20;
         *n2 = 10;
    }
  • 相关阅读:
    No module named yum错误的解决办法
    Linux下redis的安装
    Linux crontab命令的使用方法
    mysql时间查看以及定时器相关操作
    python zookeeeper 学习和操作
    使用 python 操作 redis
    Linux命令(2)- mv
    mysql 命令行参数
    框架设计
    MediatR使用
  • 原文地址:https://www.cnblogs.com/gnhxsk/p/5170639.html
Copyright © 2011-2022 走看看