上次和朋友聊飞手去了,就留了个标题在这,今天接着上次的内容开始
多维数组与指针
之前说到了数组名在 typeof sizeof &,这三种情况是指整个数组,其他情况都是指指针,然后我们来看看具体的几个运算
______________________________
a + 1
此处数组名a ,当指针用
a + 1 ==> &a[0] + 1 ==> &a[1]
&a[1]
与 &a[1][0] 仅数值相同,含义和类型完全不一样!!!
______________________________
a[0] + 1
此处数组名a[0] ,当指针用
a[0] + 1 ==> &a[0][0] + 1 ==> &a[0][1]
_______________________________
*((a + 1) + 1)
此处数组名a,当指针用
*((a + 1) + 1)==>*((&a[0] + 1) + 1)
==>*(&a[1] + 1)
==>*(&a[2])
==>a[2]
*(*(a + 1) + 2)
此处数组名a,当指针用
*(*(a + 1) + 2)==>*(*(&a[0] + 1) + 2)
==>*(*(&a[1]) + 2)//注意这里先结合了*&
==>*(a[1] + 2)//所以这里就变成了a[1]这个指针,a[1]是第一行的首地址,代表整个第一行,所以是a[1][0]+2
==>*(&a[1][0] + 2)
==>*&a[1][2]
==>a[1][2]
*(a[1] + 2)
==>a[1][2]
int b[4];//b是一个含有4个int类型的元素
//typeof(b) : int[4]
元素类型 [元素个数]
int a[3][4];//a是一个含有3个元素,且每个元素又是4个int的数组 的数组
//typeof(a) : int[4] [3]
元素类型 [元素个数]//再重复一遍为什么所有维度的数组都可以解释成一维数组
数组指针和指针数组
数组指针
首先我们要知道,数组指针到底是数组还是指针?我们从定义上来看。数组指针就是一个指向数组的指针,所以数组指针其本质上是指针。
那么如何去定义一个数组指针呢
int a[4];
//定义一个指针p , 指向数组a
typeof(a) *p;//定义p
typeof(a) *p;==> int[4] *p; ==> int (*p)[4]
int (*p)[4] ;//int[4] *p
定义一个数组指针
#include<stdio.h>
int main()
{
int a[3][4] = {
1,2,3,4,
5,6,7,8,
9,10,11,12
};
int (*p)[4];
p = a;
printf("%d\n",p[1][2]);//7
return 0;
}
指针数组
这就是一个数组里面储存的全部都是int*类型的元素,所以指针数组是一个数组,只不过数组里面的元素全部都是指针。
int * p[4];//p是一个数组,里面有4个元素,元素的类型是 int*
数组定义格式 :
元素类型 数组名[元素个数]
int* p [4]
int (*p)[4];//p是一个指针,指向一个数组
用指针数组输出一个数组:
#include<stdio.h>
int main()
{
int a[3] = {0,1,2};
int* p[3];
for(int i = 0 ;i<3;i++)
{
p[i] = a+i;//&a[i]这两种写法都是一样的
}
for(int i = 0;i<3;i++)
{
printf("%d\n",*p[i]);
}
return 0;
}
指针作为函数的参数
前面我们在复习函数的章节的时候就提到过,整型在作为函数的参数的时候,形参和实参是分别占用不同的内存的,所以你在写交换函数(swap)的时候一般就会去使用指针,直接交换地址(因为前面已经重点提过了,这里不再说)
#include<stdio.h>
void swap(int*a,int*b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int h = 1;
int p = 2;
swap(&h,&p);//注意这里参数的类型是指针类型所以要写成&h,&p
printf("h=%d p=%d",h,p);
return 0;
}
数组作为函数的参数
这个前面也有提到过一些,我们今天就来把形参和实参为什么要那样写来搞清楚
#include<stdio.h>
int find_max(int a[],int n)//在这里可以把int a[]改为int* a会更好理解
{
int max = a[0];
for(int i = 0;i<n;i++)
{
if(max<a[i])
{
max = a[i];
}
}
return max;
}
int main()
{
int h [3] = {0,1,2};
find_max(h,3);//h很明显在这里当指针用了,
//我们说形参和实参一一对应所以int a[]是一个指针类型哦,当然最好还是改成int* a更好。
printf("%d",find_max(h,3));
return 0;
}
int find_max(int b[],int n);
在接收实际参数 数组a时:
b = a //此时数组名 a 当指针用
==>
b = &a[10];//typeof(&a[0])==>typeof(a[0])*==>int *
函数的形式参数:
int b[] ==> int *b //b就是一个指针
==>
int find_max(int *b,int n);//这样的写法会更容易让人理解和接受
今天先把数组和指针搞定,明天在继续搞指针和函数的关系,,,,,最要是运筹学作业真太多了,无了个大语天天都要写