zoukankan      html  css  js  c++  java
  • iOS学习07之C语言指针

    本次随笔主要是为了学习和理解C语言中的指针,指针树状图如下:

    1、访问数据的两种方式

     1> 直接访问:定义变量后,直接访问变量

        int a = 10;
        printf("a = %d
    ", a);

     2> 间接访问:先找到地址,根据地址访问变量的存储单元

    图解

    2、指针

     1> 定义指针变量

      类型修饰符 *指针变量名 = NULL;

      NULL 表示空指针,相当于0,用来给指针变量赋初始值

     1       int *p = NULL;                                    
        
      p的类型: int *, p指向整数类型

      通常情况下,把指针变量称为指针

      p是指针,存储的内容是地址

     2> 赋值(地址)

      取址运算符: &

    1       int *p = NULL;
    2       int a = 10;
    3       p = &a;
    4       printf("p存放的地址是:%p
    ", p);
    5       printf("变量a存放的地址是:%p
    ", &a);

     3> 取值

      通过指针变量读取存储空间的数据

      取值运算符:*

    1       int *p = NULL;
    2       int a = 10;
    3       p = &a;
    4       printf("指针p指向的数据是:%d
    ", *p);

     4> 存储空间

      指针的存储空间与操作系统有关

       32位的操作系统,指针的存储空间占4个字节

       64位的操作系统,指针的存储空间占8个字节

    1       int *p = NULL;
    2       int a = 10;
    3       p = &a;
    4       printf("指针所占的位数:%lu
    ", sizeof(p));

     5> 区分指针中 * 的作用

      定义指针变量时,int *p = NULL; 这个 * 用来描述 p 是一个指针变量

      取值的时候, *p; 这个 *取值运算符

     6> 指针的运算

      指针只有加减运算,没有乘除运算

      定义指针类型决定了指针在运算时偏移几个字节

      第一种: p + n

       从 p 指向的存储空间开始,向高位偏移n个数据类型的字节数

       p 的地址没有发生变化

    1         int *p = NULL;
    2         int a = 10;
    3         p = &a;
    4         printf("%p
    ", p);
    5         printf("%p
    ", p + 1);

       第二种: p - n

       从 p 指向的存储空间开始,向偏移n个数据类型的字节数

       p 的地址没有发生变化

    1         int *p = NULL;
    2         int a = 10;
    3         p = &a;
    4         printf("%p
    ", p);
    5         printf("%p
    ", p - 1);

          

      第三种: p++ (p = p + 1)

       p 的指向发生改变

    1         int *p = NULL;
    2         int a = 10;
    3         p = &a;
    4         printf("%p
    ", p);
    5         p++;
    6         printf("%p
    ", p);

      第四种: p-- (p = p - 1)

       p 的指向发生改变

    1         int *p = NULL;
    2         int a = 10;
    3         p = &a;
    4         printf("%p
    ", p);
    5         p--;
    6         printf("%p
    ", p)

     3、指针与数组

    1     int arr[] = {1,3,5,7,9};
    2     int *p = NULL;
    3     p = arr;

     数组名是数组元素的首地址,故第3行的代码不能加 &

     1> 通过指针访问数组元素

     下标法

    1     for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
    2         printf("arr[%d] = %d
    ", i, p[i]);
    3     }

       

    指针法

      通过指针偏移计算数组中的元素

      不修改指针指向:* (指针变量(数组名) + 下标)

    1             for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
    2                 printf("指针变量	 + 下标	: arr[%d] = %d
    ", i, *(p + i));
    3                 printf("数组名	 + 下标	: arr[%d] = %d
    ", i, *(arr + i));
    4             }

      修改指针指向*(指针变量++)

    1             for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
    2               printf("指针变量	 + 下标	: arr[%d] = %d
    ", i, *(p++));
    3               //printf("数组名	 + 下标	: arr[%d] = %d
    ", i, *(arr++)); // arr是数组的首地址,它是一个常量,故必能改变
    4             }

      第3行代码会报错

      因为指针可以重定向,但是数组名常量首地址,不可以修改

    图解

     2> 指针变量和数组的区别

      1. 指针可以重定向,但是数组名是常量首地址,不可以修改

      2. 不能通过指针计算数组元素的个数

       指针的存储空间:4 8 个字节

       数组的存储空间 = 元素个数 * 每个元素所占的字节数

     3> 指针的类型一定要和数组元素的类型相匹配

    1     short arr[4] = {3, 7, 9, 1};
    2     int *p = arr;
    3     char *q = arr;
    4     printf("%d
    ", p[0]);
    5     printf("%d
    ", q[0]);

      运行结果:

        

    图解

          

     4、指针与字符串

     1     char str[] = "shangtian";
     2     char *p = str;
     3     
     4     printf("%s
    ", str);
     5     printf("%s
    ", p);
     6     
     7     *p = 'S';
     8     printf("%s
    ", p);
     9     
    10     char *q = "xiadi"; // 常量字符串
    11     printf("%s
    ", q);
    12     
    13     *q = 'X'; // 运行会出现内存崩溃现象,
    14     printf("%s
    ", q);

     第13行代码在运行时,会出现内存崩溃现象

     因为 q 指向的是一个常量字符串,常量字符串不能进行修改

      总结:指向常量的指针可以读取和修改数组元素,指向常量字符串的指针,只能读取,不能修改

    5、指针数组

      存放指针元素的数组

    1     char *strArray[3] = {"iPhone", "iPad", "iWatch"};// 指针数组:存放指针元素的数组
    2     for (int i = 0; i < 3; i++) {
    3          printf("%s
    ", strArray[i]);
    4     }
    5     for (int i = 0; i < 3; i++) {
    6         printf("%p
    ", strArray[i]);
    7     }

    图解

    6、指针与函数

     1 // 指针与函数
     2 void changeValue(int *a, int *b) {
     3     int temp = *a;
     4     *a = *b;
     5     *b = temp;
     6 }
     7 
     8 void printArray(int *p, int count) {
     9     for (int i = 0; i < count; i++) {
    10         printf("%d
    ", p[i]);
    11     }
    12 }
    13 
    14 int main(int argc, const char * argv[]) {
    15     
    16     // 指针与函数
    17     int a = 10;
    18     int b = 20;
    19     
    20     printf("a = %d, b = %d
    ", a, b);
    21     
    22     changeValue(&a, &b);
    23     
    24     printf("a = %d, b = %d
    ", a, b);
    25     
    26     // 指针表示数组
    27     int arr[4] = {2, 4, 3, 7};
    28     
    29     printArray(arr, 4);

    图解

  • 相关阅读:
    银行业务调度系统
    Apache虚拟主机配置
    linux下 redis 启动
    linux下mysql 启动命令
    linux 查看磁盘空间大小
    基于微信地理位置的附近商家距离坐标数据查询方法
    mysql表无权限访问
    linux用户操作
    Java中Date各种相关用法
    spring 定时任务的 执行时间设置规则
  • 原文地址:https://www.cnblogs.com/gfxxbk/p/5276120.html
Copyright © 2011-2022 走看看