11.29C语言学习笔记(指针与二维数组)

11.29C语言学习笔记(指针与二维数组)

接11.18学习笔记https://blog.csdn.net/FriedReich/article/details/121402242

指针访问一维数组

#include<stdio.h>
int main()
{
    
    
    int a[3]={
    
    1,3,5};
     printf("%p\n",a);
     printf("%p\n",a+1);
     printf("%p\n",&a);//此处赋予的是一个数组的常量地址,所以说printf行1的结果和行3的结果没有变化。
     printf("%p\n",&a+1);//这是一个有三个元素的数组,占位12个字节,所以当这个常量地址往后增加一个单位的之后,所显示的指针变量往后增加12个单位。
     printf("%p\n",*(&a));//该数组常量地址所对应的指针变量 这里可以理解为两符号相消
     printf("%p\n",*(&a)+1);
    return 0;
}

指针访问二维数组

1、访问按行优先,所以有限定义列数。

第一种访问方式类似与一维数组 (指针变量p)

二维数组访问方式:

定义了二维数组 a[][]

数组名a对应的是第一行的首地址。

a每次后移一个单位,对应为下一行的首地址。

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

指针与二维数组

恒等表达式:

指向每一行第一个元素的值:

*(a+i)=a[i] (都为a数组第i行的首地址)

推导:

*(a+i)+j=a[i]+j(都为a数组第i行第j列的首地址)

口诀:行地址变列地址加“*”;列地址转行地址加“&”

实例:

1、传统一维数组的访问:

#include<stdio.h>
int main()
{
    
    
	int a[3][2];
	int i;
	int *p=&a[0][0];
	for(i=0;i<3;i++{
    
    
		printf("%p\t%p\n",p+i,p+i+1);
        printf("%d\t%d\n",*(p+i),*(p+i+1));//此处若将p换成a,系统识别的数据类型就会出现差错
        //一般的,还是负值一个单独的指针变量,以便访问
	}
    return 0;
}

行指针的定义

类型标识指示符(*指针变量名)[整形常量表达式];

例如: int(*p)[3]

定义了指针变量p,指向了一个长度为3的一维数组。

(对于二维数组而言,定义的指针变量p所指向的数组元素应与该二维数组的列数相同。)

#include<stdio.h>
int main()
{
    
        
	int a[3][2]={
    
    1,2,3,4,5,6};
	int i,j;
	int (*p)[2];//此处指针变量p指向了一个长度为2的数组
	p=a;//p和a等价后,p+i与a+i都等价于往后增i行
    //此时p[i]等价于a[i]
    //p[i][j]等价于a[i][j]
	for(i=0;i<3;i++)
	{
    
    
		for(j=0;j<2;j++)
        {
    
    
            printf("%p\t%d\n",p[i]+j,p[i][j]);
        }
	}
    return 0;
}
#include<stdio.h>
int  main()
{
    
    
	int a[3][2] = {
    
     1,2,3,4,5,6 };
	int(*p)[2];
	p = a;
	int i, j;
	for (i = 0; i < 3; i++)
	{
    
    
		for (j = 0; j < 2; j++)
		{
    
    
			printf("%p\t%d\n", *(a + i) + j, a[i][j]);
			printf("%p\t%d\n", a[i] + j, a[i][j]);
			printf("%p\t%d\n", p[i] + j, a[i][j]);
		}
		printf("\n");
	}
	return 0;
}

指针数组

(先定义地址再对标相应的值)

类型标识符*指针变量名[整型变量表达式];

例如 int *a[5]

a[0]a[4]都是类型为int的指针变量

举例 利用指针数组访问二维数组

int main()
{
    
    
	int a[3][2]={
    
    1,2,3,4,5,6};
	int i,j;
	int *p[3];
	for(i=0;i<3;i++)
	{
    
    
		p[i]=a[i];
		for(j=0;j<2;j++)
		{
    
    
			printf("%p\t%d\n",p[i]+j,p[i][j]);
		}
return 0;
}

指针数组与行指针定义的区别

行指针定义 例如: int(*p)[3]旨在用指针p指向一个长度为3个单位的数组,

运用于二维数组的时候指针p赋值为已定义的二维数组名,即指针p控制的是行,所指向的数组控制的是列。

指针数组 例如 int *a[5]旨在定义一个数组类型的指针,该组中每一个元素对应地址,

一般的,定义的指针数组元素对标的是所需赋值数组的行首地址。

おすすめ

転載: blog.csdn.net/FriedReich/article/details/121667763