指向元素的指针和指向数组的指针,行级指针

  • 这俩概念还是很不一样,请君明鉴
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
    //指向元素的指针和指向数组的指针
    int b[10] = {1,2,3,4,5,6,7,8,10};
    int *p = b;//代表指向数组首元素地址的指针!!!
    int(*q)[10] = &b;//代表指向数组的指针!!!
    printf("指向数组首元素地址的指针,代表的内存大小%d
",sizeof(*p));
    printf("指向数组的指针,代表的内存大小%d
", sizeof(*(q)));

    getchar();
}

  •  对于一个二维数组,指针的含义
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
    int a[3][4] = { { 9, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
    printf("a的地址:%p  其指向的数据大小%d
",a,sizeof(*(a)));
    printf("&a的地址:%p  其指向的数据大小%d
", &a, sizeof(*(&a)));
    printf("*a的地址:%p  其指向的数据大小%d
", *a, sizeof(**a));
    getchar();
}

 

 尽管内存大小都一样,但是从取地址操作来看,a为指向一行的指针,&a代表指向整个二维数组的指针,*a代表a指向的那一行的首元素的地址

  • 行指针的表示方法
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{

    //printf();
    int a[3][4] = {66, 2, 3, 4 , 5, 6, 7, 8 ,9, 10, 11, 12 };
    //*(a + 1)
    printf("a代表行指针,指向一行,取出这个行地址操作*a,可知,这个行包含了4个整型元素。大小为%d
", sizeof(*a));
    printf("&a代表指针指向整个二维数组,通过取地址操作*&a可知,二维数组大小%d
", sizeof(*&a));
    printf("*a代表指针指向行的首元素,通过取地址操作**a可知,这个元素大小%d,其值为%d
", sizeof(**a),**a);
    getchar();
}

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void main()
{
    int a[3][4] = { { 66, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
    printf("(*a+2)表示第一行第三个元素的地址,不信?那咱试试%d
",*(*a+2));
    printf("*(a+2)的大小%d,a[2]的大小%d
",sizeof(**(a+2)),sizeof(*a[2]));//说明他们同为列指针
    printf("a+2的大小为%d
",sizeof(*(a+2)));//说明a+2是行指针
    getchar();
}

 由此可见a+2是行指针指向第三行

原文地址:https://www.cnblogs.com/saintdingspage/p/11957124.html