回顾:
指针的概念:
1.指针是一个变量,用来存放地址
内存会划分为小的内存单元
每个内存单元都有一个编号
这个编号就被称为地址,把地址也叫指针
内存编号=地址=指针
指针或者地址可以存放到指针变量中
2.指针的大小是固定的4/8个字节
3.指针有类型,决定了指针加减整数的步长
————————————————————
1.字符指针
//常见用法
int main()
{
char ch='w';
char* pc=&ch;
*pc='a';
printf("%c\n",ch);
}
int main()
{
const char* p="abcdef";//把abcdef字符串a的地址存到p里,加const防止修改
printf("%c\n",*p);//打印a
printf("%s\n",p);//abcedf
}
int main()
{
const char* p1="abcdef";
const char* p2="abcdef";
char a1[]="abcdef";
char a2[]="abcdef";
//p1==p2,a1!=a2(不加const也一样)
}
2.指针数组
存放指针的数组
int main()
{
int* arr[10];//存放整形指针的数组
char* ch[5];//存放字符指针的数组
int a=10;
int b=20;
int c=30;
int* arr[3]={&a,&b,&c};//arr就是一个指针数组
for(int i=0;i<3;i++)
{
printf("%d ",*(arr[i]));
}
}
常见用法:
1.相当于模拟一个二维数组
int main()
{
int arr1[5]={1,2,3,4,5};
int arr2[5]={2,3,4,5,6};
int arr3[5]={3,4,5,6,7};
int* parr[3]={arr1,arr2,arr3};
for(int i=0;i<3;i++)
{
for(int j=0;j<5;j++)
{
printf("%d ",parr[i][j]);//或者*(parr[i]+j)
}
printf("\n");
}
}
3.数组指针
3.1定义:
是指针
指向数组的指针
int* p1[10];//p1是数组,指针数组
int(*p2)[10];//p2是一个指针,指向一个数组
int main()
{
int a=10;
int* p=&a;
int arr[10]={0};
printf("%p\n",arr);//同
printf("%p\n",arr+1);//+4
printf("%p\n",&arr[0]);//同
printf("%p\n",&arr[0]+1);//+4
printf("%p\n",&arr);//三个值相同
printf("%p\n",&arr+1);//+40
int (*p)[10]=&arr;
//p是一个指针,指向了数组,所以p叫数组指针
//该数组指针类型int (*)[10]
}
数组名该怎么理解呢?
通常情况下我们说的数组名都是数组首元素的地址
但是有2个例外
1.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小
2.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址
___数组指针有什么用?
一维数组打印:
void print(int(*p)[10],int sz)
{
int i=0;
for(i=0;i<sz;i++)
{
printf("%d ",*(*p+i));
}//*p相当于数组名,数组名又是首元素地址所以*p就是&arr[0]
printf("\n");
}
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
//写一个函数打印arr数组的内容
print(&arr,10);//把数组的地址传过去
}
二维数组的打印
void print(int (*p)[5],int c,int r)
{
int i=0,j=0;
for(i=0;i<c;i++)
{
for(j=0;j<r;j++)
{//p+i是指向第i行的
//*(p+i)相当于拿到了第i行,也相当于第i行的数组名
//数组名表示首元素的地址,*(p+i)就是第i行第一个元素的地址
printf("%d ",*(*(p+i)+j)) ;
}
printf("\n");
}
}
int main()
{
int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
print(arr,3,5);
}