C语言:数组指针和数组指针的理解

数组指针和指针数组如何分辨呢看他后面的侧重:

例如:

分解: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);
}


猜你喜欢

转载自blog.csdn.net/qq1294272813/article/details/70176329