数组指针和指针数组如何分辨呢看他后面的侧重:
例如:
分解:int *a[3]---> int *[3]=a; //指针数组
int (*b)[3]--> int [3]=*b //数组指针
代码片段:这段代码定义了一个数组指针和一个数组指针,利用指针的偏移来做测试
#include<stdio.h>
{
int i=10,j=18,k=56,loop,i;
int *a[3]={&i,&j,&k};
int (*b)[3]; //数组指针
char str1[] = "Good";
char str2[] = "welcome";
char str3[] = "Hello";
char *str[3] = {str1,str2,str3}; //指针数组(数组里面存的是指针)
//这里补充下:int *p; int str[10]; p=str;这里把数组str的首地址给了指针p(又可以写成:int *p=str)很显然这个指针数组存的是三个字符串的首地址
for(i=0;i<3;i++)
//printf("%c ",*str[i]);//这个显示的就是G W H 三个字符串的首个字母(*str[i] 首地址取值)
//printf("%s ",str[i]);//这个显示的就是Good welcome Hello 前面的转义字符换成%s实现了串的全部显示:(printf("%s\n",str1);这代码告诉你为何前面没有加*)
}
//指针数组与二维数组
#include <stdio.h>
#include <stdlib.h>
#define M2
#define N 3
int main()
{
int i,j;
int a[M][N] = {{1,2,3},{4,5,6}};
// int *p = a;
int (*p)[N] = a;
printf("a = %p\n",a); //打印二维数组a的首地址
printf("a+1 = %p\n",a+1); //二维数组首地址+1就会跳到下一行的首地址:地址移动[N]列(运行观看地址变化)
printf("p = %p\n",p);//首地址给了P指针与直接操作a数组一样
printf("p+1 = %p\n",p+1);//P是一个数组指针,P+1就是移动[N]个
for(i = 0 ; i < M; i++)
{
for(j = 0 ; j < N; j++)
printf("%p -> %d\n",&p[i][j],p[i][j]);//依次打印出地址并对应的值
//printf("%p -> %d\n",*(p+i)+j,*(*(p+i)+j));//列指针*(p+i)+j取出列的地址(降级操作),再加一个*就是取出 列指针的值*(*(p+i)+j)
printf("\n");
//*(p+i)存的是行
}
exit(0);
}