我们都知道指针可以用来存放地址。这个地址包含很多,比如字符地址&a,数组地址arr,字符串首地址,函数地址,等等。今天主要跟大家分享一下指针数组和数组指针的一些概念和学习心得。
1,字符串首地址是什么鬼
char* p="abcde";
这里就是把字符串“abcde“的首地址”a”的地址存储到指针变量p中,*p指向a。此时的“abcde”为常量字符串是不允许改变的,如果要打印字符串可以直接
printf("%s",p);
打印字符串可以用字符串数组啊!
char arr[10]="abcde";
printf("%s",arr);
此时的“abcdef”是可以被改变的。
为什么要说这个,有什么用呢?因为面试会考啊!
分享一个面试题:
char arr1[]="abcde";
char arr2[]="abcde";
char *p1="abcde";
char *p2="abcde";
问:arr1=arr2 ? p1=p2?
答案是 :arr1!=arr2 p1=p2
因为*p1和*p2是常量字符串不允许被修改所以首地址是相同的,arr1,arr2明显是两个不同的数组,首地址怎么能相同呢。
好了步入正题。
2,指针数组
指针数组是一个存放指针的数组。元素就是地址。
指针数组是如何定义的:首先它是一个数组要有数组名,其次数组里要存储元素要有元素类型,再加上元素内容就定义完成了 如下
char* arr[]={&a,&b,&c};
char* arr[]={p1,p2,p3};
char* arr[]={"abc","bcd","def"};
由此可见数组元素可以是地址,指针,字符串。但本质上它们都是地址哈。这里的arr[0],arr[1],arr[2],都是指针对应的地址。
3,数组指针
数组指针是指针,指向数组。
对于一维数组:
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int (*p)[10]=&arr;
这个代码的意思是:p是一个数组指针,它指向一维数组arr,数组有十个元素,元素类型是int。这里的&arr表示整个数组的地址,而不是首地址。p+1会跳过整个数组。
可以这么理解:这个数组指针一下定义了十个指针,每个指针都要对应一个地址,所以赋值要赋整个一维数组的地址。要加&符。
如何使用它呢?
可以这么理解:p指向arr,*p为arr的首地址就相当于arr,arr[i]等价于(*p)[i]。
对于二维数组:数组指针一般都用于二维数组。
int arr[3][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
int (*p)[5]=arr;
for(int i=0;i<3;i++){
for(int j=0;j<5;j++){
printf("%d",*(*(p+i)+j));
}
}
对于这个代码为什么给数组指针赋值的时候没有加&,因为arr为二维数组的首元素地址,二维数组可以看成一个一维数组,他的元素也是一维数组。此时的arr就是{1,2,3,4,5}整个数组的地址所以不需要加&。
打印数组元素的时候用到*(*(p+i)+j),这里的p+i指向arr第i个一维数组。*(p+i)是第i个一维数组的首地址。*(*(p+i)+j)是第i个一维数组的第j个元素。
第一次写博客写的不好还请嘴下留情哇!