DAY9

发布时间 2023-08-01 14:46:28作者: Ninnne

指针练习

一:

#include <stdio.h>
​
int main(){
    int a[3][4] = { 0 };
    printf("%d\n",sizeof(a));//48 = 3*4*sizeof(int) 
    printf("%d\n",sizeof(a[0][0]));//4
    printf("%d\n",sizeof(a[0]));//16
    printf("%d\n",sizeof(a[0]+1));//4(表示的是第一行的第二个元素的地址) 
    printf("%d\n",sizeof(*(a[0]+1)));//4(表示第一行第二个元素)
    printf("%d\n",sizeof(a+1)); //4(表示第二行的地址)地址就是4 
    printf("%d\n",sizeof(*(a+1)));//16 
    printf("%d\n",sizeof(&a[0]+1));//4(表示第二行的地址) 
    printf("%d\n",sizeof(*(&a[0]+1)));//16
    printf("%d\n",sizeof(*a));//16(表示第一行) 
    printf("%d\n",sizeof(a[3]));//16 
    
    
    return 0; 
} 
​

输出结果:

48
4
16
8
4
8
16
8
16
16
16

二:

#include <stdio.h>
​
int main(){
    int a[4] = {1,2,3,4};
    int* ptr1 = (int*)(&a+1);
    int* ptr2 = (int*)((int)a+1);//a的首元素地址加1,就是int+1,就差一个字节 
    printf("%x %x",ptr1[-1],*ptr2);//%x是以16进制形式进行打印 
    //ptr1[-1]=*(ptr1+(-1))=*(ptr1-1)
    
    return 0; 
} 

输出:

4 2000000

三:

int main(){
    int a[3][2] = {(0,1),(2,3),(4,5)};//逗号表达式,所以是{1,3,5}放入数组
    int *p;
    p = a[0];//把第一行的首元素地址放入p
​
    printf("%d",p[0]);//p[0] = *(p+0)
    return 0; 
} 

输出:

1

四:

#include <stdio.h>
​
int main(){
    int a[5][5];
    int (*p)[4];
    p = a;//二维数组a表示第一行地址
​
    printf("%p %d\n",&p[4][2] - &a[4][2],&p[4][2] - &a[4][2]);
    //p[4][2] = *(*(p+4)+2)
    //指针减指针得到的是两个指针之间的元素个数
    //%p是指针的输出转换符
    return 0; 
} 

输出:

fffffffffffffffc -4

 

五:

#include <stdio.h>

int main(){
	int a[2][5] = {1,2,3,4,5,6,7,8,9,10};
    int *ptr1 = (int*)(&a+1);//取出二维数组地址加一
    int *ptr2 = (int*)(*(a+1));//*(a+1) = a[1]
    printf("%d %d",*(ptr1-1),*(ptr2-1));
    return 0; 
} 

输出:

10 5