一、指针。
1、指针的概念:指针就是地址。
2、指针的大小是固定的(32位平台下是4字节,64位平台下是8字节)
3、指针(指针变量)也是一个变量,用来存储地址的变量,
4、指针也有类型。
有整形指针,字符指针,数组指针,结构体指针,函数指针等等。
整形指针:
int a=10;int *p=&a;*p=20;//则a的值,通过p指向a,通过a的地址改变了a的内容,此时a=20;
*p(对指针解引用),解引用是指针指向其对应的内容
字符指针:
char ch='p';char*q=&ch;*p='w';
数组指针:
数组指针也是指针,要和指针数组区分
指针数组是数组,数组的内容是指针。(int *p[10]指针数组)
数组指针指向的是数组的指针而已,(int (*p)[10])
4 、指针运算
指针加一,对其加上指针指向类型的大小。
比如int a[10]={0,1,2 ,3};
int *p=&a[0];//p+1也是指针,指向a[1];加一在内存上其实加了4(sizeof(int ))个字节。即*(p+1)=1;
二、数组名
我们一般学习指针的时候,总是会谈到数组,因为数组名也是指针。
数组名和&数组名的区别
int arr[10]//一维数组
arr代表的是数组首元素的地址。
&arr代表数组的地址。
两者的打印的地址值是一样的,但是意义不一样。
三、数组指针的使用
当二维数组当作参数被调有时会发生降维,降维成数组指针。
#include<stdio.h>
void Print_arr1(int arr[][3], int x, int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
}
void Print_arr2(int(*arr)[3], int x, int y)
{
for (int i = 0; i < x; i++)
{
for (int j = 0; j < y; j++)
{
printf("%d", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[2][3] = { 1,2,3,4,5,6 };
Print_arr1(arr, 2, 3);
Print_arr2(arr, 2, 3);
return 0;
}
如上两种传参方式等价,运行结果一样。