嵌入式学习day7(C基础指针)


一丶二级指针

           一级指针:存放变量地址

           二级指针:存放一级指针的地址
           格式:存储类型 数据类型 ** 指针变量名
           例:
int a = 3;
                  int *p = &a;
                  int **q = &p;//
访问a的值:a  **q  *p
                                       访问a的地址:&a  p  *q
                                       
访问p的地址:&p  q

二丶指针和数组

          直接访问:按变量的地址存取变量的值(通过数组名访问)
          间接访问:通过存放变量地址的变量去访问变量(通过指针访问)

1.  指针和一维数组

      int a[5] = {1, 2, 3};
      int *p = a;
      直接访问和间接访问:

     注意:a和p本质上不同,a是地址常量,p是变量,a不能执行++操作,但是p可以

               访问数组元素 a[i]的值:
                                                 直接访问:a[i]        *(a+i)
                                                 间接访问:p[i]        *(p+i)

                访问数组元素 a[i]的地址:
                                                 直接访问:&a[i]       a+i
                                                 间接访问:&p[i]       p+i

2.指针和二维数组

           int a[2][3] = {1, 2, 3, 4, 5, 6};

               a:数组名,表示第一行的首地址
               a+1:第二行的首地址
               在a前面*,表示将行地址降级为列地址
                  *a:第一行第一列的地址
                  *a+1:第一行第二列的地址
                  *(a+1):第二行第一列的地址
                  *(a+1)+1:第二行第二列的地址

直接访问:

间接访问:

                int a[2][3] = {1, 2, 3, 4, 5, 6};
                int *p = a; // 报错,两者的数据类型不同
                如果想要对二维数组间接访问需要使用数组指针

3.数组指针

             定义:本质上是指针,指向的是数组(又称行指针)

             格式:存储类型 数据类型 (*指针变量名)[列数];
              
例:int a[2][2]={1,2,3,4};
                     int (*p)[2]=a;//定义一个数组指针p
                     p:第一行的首地址 p+1:第二行的首地址
                     p+1:移动8个字节(列数2*数据类型的大小)
                     p可以代替a进行元素访问,但是本质不同

            访问 a[i][j] 地址: *(p+i)+j         p[i]+j
            访问 a[i][j] 内容:*(*(p+i)+j)    *(p[i]+j)

           数组指针的大小p:sizeof(数组指针名)(和操作系统有关:64----8 32----4)

4.指针数组

       定义:本质上是数组,里面存放的是指针
       格式:存储类型 数据类型 *数组名[元素个数];//
int *arr[2];

      应用实例:

       (1).用于存储普通变量的地址
              
int a = 10, b = 20, c = 30;
              int *p[3] = {&a, &b, &c};
              
访问b的地址:*(p+1)      p[1]
              访问 b 的值:*(*(p+1))   *p[1]

    (2).用于存放二维数组的每一行第一个元素的地址(列地址)
                int a[2][3] = {1, 2, 3, 4, 5, 6};
                int *p[2] = {a[0], a[1]};​​​​​​​
               
第二行第一列地址p[1] *(p+1)
               第三行元素*(p[2]+1) *(*(p+2)+1)

    (3).用于存放字符串
                  char *p[3] = {"hello", "world", "shijie"};
                 
打印shijie字符串:p[2]   *(p+2)
                  打印j这个字符: *(*(p+2)+3)  *(p[2]+3)   p[2][3]

      (4).命令行参数(int main(int argc,char const *argv[]))
                  argv:就是一个指针数组,里面存放的是命令行传递的字符串
                  argc:表示argv指针数组里面存放的数据的个数,即命令行传递字符串的个数


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值