引论
我们发现a,&a[0],&a;输出是一样的,地址一样,莫非它们都是指针?
a,&a[0]是一样的,我们不做讨论。
发现并不能把它赋给一个单独指针变量。其实这是类型不匹配导致的;
&a是一个数组型的指针,它指向数组a这块长度为4的地址空间。
a=a+1后a为a[1]的地址,而&a+1后 它便指向'\0'后面一个位置
即&a加1,每次需移动它所指向数组的大小个下标。
正文:
1.数组指针的定义即相关操作
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char a[] = "asd";
char b[] = "sss";
char(*p)[4] = &a; //数组指针
char(*q)[4] = &b; //数组指针
(*p)[2] = (*q)[2]; //数组指针的赋值
(*p)[2] = 'c'; //数组指针的赋值
strlen(*p); //求字符串长度
printf("%c\n", (*p)[2]);
printf("%s\n", *p);
printf("%s\n", p);
printf("%c\n", p[1]);
printf("%p\n", p);
printf("%p\n", *p);
}
数组指针的定义:char(*p)[i]=&a,其中i=strlen(a), 数组指针的类型应和指向的数组类型相符合;
对于数组指针p,p指向长度为四的字符串数组a这个整体,而*p=a;即*p代表p所指向的字符串数组a的首元素地址。故strlen(*p),printf("%s",*p),printf("%s",p)可以输出正确结果。而printf("%c",p[1])等同于printf("%c",a[5]);下标越界访问,如果当前地址有数据则输出,若栈中无改该地址,则程序会报错。