数组指针,指针数组,数组名,指针变量名作函数的参数

允我心安 提交于 2020-01-23 19:27:47

想当年学得比较晕的部分,近日整理了下

#include <stdio.h>
/*指针的基本概念,理解,应用,强制类型转换
初始化有三种方式:
int a,b = 1000,*pointer_a = &a,*pointer_b;    声明的同时初始化,也可先声明再初始化 
*pointer_b = &b;pointer_b = pointer_a;        赋值,b指向a指的内存,要求两者数据类型一致
所有指针类型,均占四个字节的存储空间,类型不同的指针变量之间不能直接赋值,可以通过强制类型转换
void类型是万能类型,无需任何转换,可与其他类型相互赋值 
例如:pointer_a = (int*)1245056        1245056是变量a的地址 
*/
//实例1
#if(0)
#include <stdio.h>
int main(){
    int a = 1000,*pointer_a = &a;
    char ch,*point_ch;
    point_ch = &ch;
    ch = 'A';
    *point_ch = 'B';
    pointer_a = (int*)1245056;        //把数值强制转换为指针类型,不可直接赋值 pointer_a = 1245054 
    printf("&a = %d,&ch = %d,pointer_a = %d\n",&a,&ch,pointer_a);
    printf("ch = %c\n",ch);
    printf("\n");
    return 0;    

#endif 
/*
指针数组:array of  pointers 用于存储指针的数组,元素都是指针
例如:int *p[10]=0;    定义了一个有十个元素的指针数组,0即为空指针 
同*(apoiner_array[10]),因为[]优先级高于* 
数组指针:a pointer to an array 指向数组的指针,例如int (*a)[4],元素表示(*a)[i] 

数组的指针是数组在内存中占用的一片存储单元的起始地址
数组在内存中的起始地址就是数组变量名,也是数组中的第一个元素在内存中的地址 
*/
//一维数组实例
#if(0) 
int main(){
    int a[9],*pa,total,i;
    for(i = 0;i < 9;i++)
        scanf("%d",&a[i]);        //使用下标变量输入一列整数并求和
    for(total = 0,i = 0;i < 9;i++)
    total += a[i];
    printf("a[0]+...+a[8] = %d",total); 
}
#endif
#if(0)
int main(){
int a[9],*pa,total,i;
    for(pa=a,i = 0;i < 9;i++)    //数组名就是地址,无需加& 
        scanf("%d",&pa[i]);        //使用地址常量输入一列整数并求和
    for(total = 0,i = 0;i < 9;i++)
    total += pa[i];
    printf("a[0]+...+a[8] = %d",total);     

#endif
#if(0)
int main(){
    int a[9],*pa,total,i;
    for(pa=a,i = 0;i < 9;i++)
        scanf("%d",&pa+i);        //使用指针变量输入一列整数并求和,pa+i = pa + sizeof(int)*i,等于数组第i个元素的地址 
    for(total = 0,i = 0;i < 9;i++)
    total += pa+i;
    printf("a[0]+...+a[8] = %d",total); 
}
#endif
#if(0)
int main(){
    int a[9],*pa,total,i;
    for(pa=a;pa<a+9;pa++)        //也可以用数组地址作为循环变量 
        scanf("%d",pa);
    for(total=0,pa=a;pa<a+9;pa++)
        total += *pa;
        printf("a[0]+...+a[8] = %d",total);
}
#endif

#if(0)
int main(){
    
}
#endif

/*二维数组指针        int a[3][4]
二维数组在内存中是按行优先存储的,可以将首行视为一个特殊的元素,这个元素是一个一位数组
a是这个特殊的一维数组的名称,也就是首地址,即第一个元素(第一行)的地址,指的是一整行,称为行指针
行指针是一行所共有的,所以应该等于列数,二维数组的定义必须指定列数
a+0 = &a[0],a+1 = &a[1]                //行指针
a[0] = &a[0][0],a[0]+1 = &a[0][1]    //列指针,可以理解为行指针的具体元素,采用*或&进行转换
a[1][2] = *(a+1)+2
*/ 
//通过指针访问二维数组,关注以下实例中指针的移动,数组名作参数和指针作参数的区别 
#if(0)
int main(){
    int a[2][3] = {1,2,3,4,5,6};
    int (*ptr)[3] = a;            //指向二维数组的第一个元素,也就是第一行的地址 
    printf("%d\n",(*ptr)[1],(*ptr)[2]);
    ++ptr;                        //指针指向下一行 
    printf("%d\n",(*ptr)[1],(*ptr)[2]);
    return 0}
#endif

#if(1)
void foo(int [][3]);
int main(){
    int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};        //a代表a[0][0]    
    foo(a);                                            //当整个数组作为函数的参数时,实际上是数组的地址作为函数的参数 
    printf("%d",a[2][1]);
    return 0;

void foo(int b[][3])
{
    ++b;                                            //形参得到该地址后指向同一数组 
    b[1][1] = 9;                                    //修改后,该地址指向新的元素 
}
#endif 
 /*
 四种形式对应形式
 实参            形参
 数组名            数组名
 数组名            指针变量名
 指针变量名         数组名
 指针变量名        指针变量名 
 */ 
 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!