C语言指针操作详解:二维数组、指针数组和多级指针
#include<stdio.h> int main() { static char c[][6] = { 'ABCDE','FGH','IJKL','MNOP' }; static char* cp[] = { c[0],c[1],c[2],c[3] }; static char** cpp = cp; printf("%p %p \n", *++cpp,&c[1][1]); printf("%p %p \n", *++cpp + 3,&c[2][3]); return 0; }
这段代码展示了C语言中指针操作的灵活性和强大功能。下面将逐行解释代码的执行过程:
-
#include<stdio.h>:包含了标准输入输出库的头文件,用于使用printf函数。 -
int main():定义了一个主函数,程序从这里开始执行。 -
static char c[][6] = { 'ABCDE','FGH','IJKL','MNOP' };:定义了一个二维字符数组c,它包含了4个字符串常量。每个字符串的长度是6。使用static关键字声明变量,使变量在函数结束后依然存在,并默认初始化为0。 -
static char* cp[] = { c[0],c[1],c[2],c[3] };:定义了一个字符指针数组cp,它包含了指向c数组各个元素的指针。c[0]、c[1]等分别指向二维数组c的第一行、第二行...。 -
static char** cpp = cp;:定义了一个指向字符指针的指针cpp,并将其初始化为指向cp数组的第一个元素。 -
printf("%p %p \n", *++cpp,&c[1][1]);:使用printf函数打印两个指针的值。*++cpp:先将cpp指针自增1,然后取出指针所指向的值,即cp[1],它指向c[1]。++cpp表示先自增再取值,*cpp表示取值,因此*++cpp等同于*(cpp+1)。&c[1][1]:表示c[1][1]的地址,即c数组第二行第二个元素的地址。
-
printf("%p %p \n", *++cpp + 3,&c[2][3]);:再次使用printf函数打印两个指针的值。*++cpp + 3:先将cpp指针自增1,然后取出指针所指向的值,即cp[2],它指向c[2]。*++cpp等同于*(cpp+1)。然后对该指针进行地址偏移3,即指向c[2][3]。&c[2][3]:表示c[2][3]的地址,即c数组第三行第四个元素的地址。
-
return 0;:主函数返回0,表示程序执行成功结束。
这段代码运行后的输出将会是两行,每行包含两个地址值。这些值可能在不同的计算机上有所不同,取决于编译器和内存布局。通过这段代码,可以深入理解C语言中指针的灵活运用以及多级指针的使用方法,为学习更复杂的程序打下基础。
原文地址: https://www.cveoy.top/t/topic/SCS 著作权归作者所有。请勿转载和采集!