C语言轻松学习-12

OK,我们接下来学习 数组指针中的指向一维数组,学习之前,我们先要了解一下什么是“数组指针”,指的是数组名的指针,即数组首元素地址的指针。即是指向数组的指针。

代码如下:这里呢,数组和指针他们几乎类似,指针也可以以数组的方式输出出来,并且数组地址 a=&a[0]=首地址

#include<stdio.h>
int main(void)
{
  int *p,a[]={1,2,3,4,5,6};
  p=a;// 另一种写法  p=&a[0]; 
  printf("%d",*p);
 }

代码调试截图如下:输出结果为 1 ,也就是输出了 a[0]的数值,

但是我们a[]数组里面的其他数值我们也想输出出来,要怎么操作呢?那么 ,接下来我们要对这个指针 进行“地址偏移”,代码如下:

#include<stdio.h>
int main(void)
{
	int *p,a[]={1,2,3,4,5,6};
	p=a;// 另一种写法  p=&a[0]; 
	for(int i=0;i<6;i++)
		printf("%d   %d\n",*(p+i),p+i);
 }

代码调试截图如下:我们通过观察发现,我们地址偏移 虽然代码中 指针p的数值+1,但是 实际输出时,p的数值却+4,那是因为,编译器会根据该指针的类型而决定加多少,这里 指针p为整数型,所占内存大小为4个字节,所以每次偏移一个单位时,会自动将指针p的数值增加4

当然,不用小括号也可以使用中括号来实现,代码如下:

#include<stdio.h>
int main()
{
  int *p,a[]={0,1,2,3,4,5};
  p=a;
  for(int i=0;i<6;i++)
  {
    printf("a[%d]=%d,&a[%d]=%d,p[%d]=%d,*p[%d]=%d\n",i,a[i],i,&a[i],i,&p[i],i,p[i]);
  }
  return 0;
}

代码调试截图如下:观察调试输出结果。数组的第一个数组元素a[0]的地址(首地址)为“6487536”,第二个数组元素a[1]的地址为“6487540”,第三个数组元素a[2]的地址为“6487544”这与我之前的文章“数组的内存分配”匹配,因为是整数型数组,整数型大小是4个字节,所以每个元素的内存地址连续且相邻相差4个字节,

好的,我们接下来学习,数组指针 指向 字符串,也就是 数组指针 指向 字符类型的数组(字符串),代码如下:

其中,输出时,%s必须要和内存地址对应,我在 第十章 中讲到过,当然我们也可以用,%c一个字符一个字符的输出出来(太繁琐了)

#include<stdio.h>
int main(void)
{
  char *p,a[]={"Hello world!"};//字符串结尾符号 '\0' 
  p=a;// 另一种写法  p=&a[0]; 
  printf("%s\n",p);	//%s必须要和内存地址对应! 
  for(int i=0;i<13;i++)
    printf("%c",p[i]); 
 }

代码调试截图如下:

OK,接下来学习,数组指针 指向 二维数组,我们根据我们之前学的,二维数组的内存分部规律,我们可以直接类似指向一维数组一样地进行内存地址偏移,从而得到二维数组的内容,代码如下:

与指向一维数组不同的是,指针的初始地址和一维数组不同,这里大家记住就行了

#include<stdio.h>
int main(void)
{
  int *p,a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
  p=a[0];// 另一种写法  p=&a[0][0]; 
  for(int i=0;i<12;i++)
    printf("%d\n",*(p+i));
 }

代码调试截图如下:

1 2 3 4 5
分享到:
赞(0)

请选择你看完该文章的感受:

9瞧一瞧 2扯淡 8学到了 1不懂 9正能量 1无聊

评论2

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址 (选填)
  1. #0
    没了吗
    user2021-11-20 9:50:32回复
    • 如果以后不是学C++这门高级语言的话。其实这一章可以不用学了,可以直接学其他高级语言了,
      lla2021-11-20 9:53:56回复