C指针的分析(数组指针和指针数组)

指针:
1. 指针基础定义:
int *p 定义一个指针看,这个指针只指向一个整形,
char *p 这个指针只指向一个字符型, 还有 double *p, float *p 等

int *p;
p 表示所指向的对象的地址, *p可以理解成对象本身

#include<stdio.h>
int main(){
  int a = 5;
  int* p = &a;

  printf("p指向的值:%d ,p的值:%d ,a的地址:%d", *p , p,&a);
  return 0;
}

执行效果如下
在这里插入图片描述

2.定义指针指向一个数组

一维指针:

#include<stdio.h>
int main(){
  int a[6]= {1,2,3,4,5,6};
  int* p = a;
  for(int i = 0; i < 6 ; i++){

      printf("p指向的值:%d,  ", *(p+i)); 
    

    }
  return 0;
}

执行效果:
在这里插入图片描述
*(p+i)) 表示指针向后移动 i 个值,int型占用内存四个字节,所以相当于每次移动四个单位

二维指针:

#include<stdio.h>
int main(){
    
  int a[2][3]= {1,2,3,4,5,6};

  printf("%d %d ", a,a+1);

  return 0;
}

输出结果
在这里插入图片描述
a是而二维矩阵地址 a+i 相当于地址向后移动 i 行,也就是说 结果是:首地址 + i*sizeof(a[0]) ,上题代码中,一行有三个数据,消耗12个字节 ,因此图片中 a 的地址是 6422016 而 a+1 的地址是 6422028 (移动了12个字节单位)

#include<stdio.h>
int main(){

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

  printf("%d %d  %d %d %d %d", *a,a[0],*a+1, a[1]+1, a+1,a);

  return 0;
}


执行效果如下:
在这里插入图片描述

a 表示第一行第一个地址 , a[0] 表示第一行第一个地址,与a 效果相同 , 而*a+1,表示第一行向右移动一个int的地址(一个int是四字节), a+1表示指针向后移动一行 a[1] + 1 表示第二行同时向右移动一个地址 a 则表示二维矩阵占用内存的起始地址

指针数组:
指针数组 本质是一个数组,只是数组中保存的值是指针(地址),
int *p[ ] 由于[ ] 的优先级比 * 高,实际是 int *(p[ ]),将数组的每一个值定义为int型的指针。

#include<stdio.h>
int main(){

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

  printf("%d ", *(a[0]));

  return 0;
}

执行结果
在这里插入图片描述
将a[6]中的每个值定义为指针,访问a[0],也就是访问地址是6422024的值

数组指针:

#include<stdio.h>
int main(){

  int a[3][4]= {{0,1,2,3},{4,5,6,7},{8,9,10,11}};

  int (*p)[4] = a;

  printf("%d ,%d \n",sizeof(*p),sizeof(*(p+1)));
}

运行结果:
在这里插入图片描述
此时p指向的是一个数组,长度为4个int 也就是16个字节,而 *(p+1) 表示移动到下一个单位, 向后移动16字节,指针指向的每一个大小都是16字节

使用数组指针遍历二维矩阵:

#include<stdio.h>
int main(){

  int a[3][4]= {{0,1,2,3},{4,5,6,7},{8,9,10,11}};

  int (*p)[4] ;
  p = a;
  for(int i = 0; i < 3; i++){
    for(int j = 0; j < 4; j++){
        printf("%d ,%d \n",(*(p+i)+j),*(*(p+i)+j));
    }
  }
}

运行结果:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乔二梦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值