一、数组指针
1、数组指针--指向数组的指针
2、声明:
int (* ptr)[100] = NULL; //声明指向数组的指针,数组内有100个int元素
char (* ptr1)[10] = NULL;
3、访问数组指针指向数组的元素
(* ptr);// 访问第一i个元素
或者 *(*ptr+i)
4、数组指针的使用
int a[100];
正确的赋值方式:
ptr = &a;//
或者 ptr = (int (*)[100])a;
错误的赋值方式:ptr=a;
因为:数组的名字会被隐式地转换为指向数组第一个元素的指针。而数组指针是指向整个数组的指针,所以ptr=a这种赋值方式不正确。必须显示地强制类型转换ptr = (int (*)[100])a;或者p = &a,这里&a也是可以到指向数组的指针。
5、数组指针的举例:
#include
#include
#include
int main()
{
int a[10] = {1,2,3,4,5,6};
int (*ptr)[10] = NULL;//数组指针
ptr = (int (*)[10])a;//通过显示类型转换为ptr赋值
printf("%p %p\n",ptr,a);
printf("%d ",(*ptr)[2]);
printf("%d\n",*(*ptr+4));
return 0;
}
函数的执行结果 0xbfa82dd4 0xbfa82dd4
3 5
可以看出ptr存放的内存地址和a所存放的内存地址是一样的都指向数组的首地址。但是ptr是指向数组的指针,而a被隐式地转换为指向数组第一个元素的指针。
对ptr+1加的长度是整个数组的长度,而a+1加的加的长度是一个数组元素的长度。
ptr是变量可以自加,自减操作。而a是变量,不能执行自加自减少。
二、指针数组
1、指针数组--数组元素都是指针类型的数组
2、声明
char *str[10];//声明一个有10个元素的数组,每个元素都是一个char *型指针。
int *array[10];//声明一个有10个元素的数组,每个元素都是一个指向int *型指针
3、数组指针的使用
#include
#include
#include
int main()
{
char *str[5];//定义数组指针
char s[10];
int i = 0;
for (;i < 5;++i)
{
printf("输入一个字符串:");
scanf("%s",s);
str = (char *)malloc(sizeof(s));//给每个指针分配内存
strcpy(str,s); //复制字符串
}
for (i = 0;i < 5;++i)
{
printf("str[%d] = %s\n",i,str);
}
for (i = 0;i < 5;++i)
{
free(str);//释放内存
}
return 0;
}
程序的执行结果如下:
输入一个字符串:aaaaa
输入一个字符串:bbbbbb
输入一个字符串:ccccc
输入一个字符串:ddddddddd
输入一个字符串:eeeee
str[0] = aaaaa
str[1] = bbbbbb
str[2] = ccccc
str[3] = ddddddddd
str[4] = eeeee
这是在网上查到的,学习了。 |