C 指针和多维数组 个人理解
Posted 河马哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C 指针和多维数组 个人理解相关的知识,希望对你有一定的参考价值。
//可能有误解,后面再改
#include<stdlib.h>
#include<stdio.h>
int main(void)
{
int he(int *p,int n); //函数声明
int he_1(int (*p)[3],int n);
int a[5] = {1,2,3,4,5};
int *pi;
int (*p)[5]; //只能指向带5个元素的一维数组,不能指向某个元素,p的值应该是一维数组的起始位置
//p = a; //报错,类型不同
p = &a;
pi = a; //两行是同样的意思,a 就是 &a[0]的地址
//pi = &a[0];
printf("%d\n",p[3]); //&a[3]的地址
printf("%d\n",(*p)[3]); //a[3]的值
printf("%d\n",pi[3]);
printf("%d\n",*(pi+2));
//我的理解是:虽然都是同样的地址,但是意义不同,
//a是数组的首元素地址,就是a[0]的地址,操作的时候+1就是指向下一个元素
//&a是数组的首地址,操作多维数组时,+1就指向下一行数组了
printf("%d\n",a);
printf("%d\n",*a);
printf("%d\n",&a);
printf("一下是二维数组:\n");
//一维跟二维有不同点
int b[2][3] = {{1,2,3},{11,22,33}};
int (*pj)[3];
pj = b;
printf("%d\n",pj); //&b[0]
printf("%d\n",pj+1); //&b[1]
printf("%d\n",*pj); //b[0]的值,也就是&b[0][0]
printf("%d\n",*(pj+1)); //b[1]的值,也就是&b[1][0]
printf("%d\n",(*(pj+1)+1)); //也就是&b[1][1],是地址
printf("%d\n",*(*(pj+1)+1)); //也就是b[1][1],是值
printf("%d\n",(*pj)[1]); //指针数组对应下标指向的值
printf("%d\n",*pj[1]); //对应二维数组第二行,当超出数组范围也不会报错,但是值就不确定了
printf("%d\n",pj[1][1]); //用类似数组的方式访问值
printf("%d\n",b);
printf("%d\n",*b);
printf("%d\n",&b);
//一维和多维的区别也直接导致当作为函数形参传递时的不同
printf("一维数组的和是:%d\n",he(a,6)); //p = a,跟上面例子相同
printf("二维数组的和是:%d\n",he(*b,6)); //p = *b
//printf("一维数组的和是:%d\n",he_1(&a,2)); //类型不同,数组长度不一样不能用
printf("二维数组的和是:%d\n",he_1(b,2));
return 0;
}
int he(int *p,int n) //求和的函数
{
int he1 = 0;
for(int i= 0; i < n; i++,p++)
{
he1 = he1 + *p;
}
return he1;
}
int he_1(int (*p)[3],int n) //求和的函数
{
int he1 = 0;
for(int i= 0; i < n; i++)
{
for(int j= 0; j < 3; j++)
{
he1 = he1 + *(*(p+i)+j);
}
}
return he1;
}
以上是关于C 指针和多维数组 个人理解的主要内容,如果未能解决你的问题,请参考以下文章