c语言指针如何显示内存地址,C语言指针、数组和内存地址

本文详细介绍了C语言中指针与数组的区别,包括指针变量和数组变量的表示方法,以及如何通过指针访问数组元素。同时,探讨了const修饰符在指针和数组中的使用规则,解释了const如何限定常量和指针的可变性,并提供了相关示例代码。此外,还展示了手写sprintf函数的实现以及CMakeLists.txt配置文件的编写。
摘要由CSDN通过智能技术生成

首先,指针和数组完全是两个东西,虽然它们看起来和内存地址的关系很类似!

指针变量:表示指向内存地址的指针,但不是内存地址

数组变量:表示数组的内存首地址

*号在等号(=)左边表示这是指针变量

*号在等号(=)右边表示解引用,即获取指针所指向的内存地址,或获取非指针变量所引用的值

&号表示获取非数组变量的内存地址,由于数组变量原本就表示数组的内存首地址,因此不能用&号去获取数组的内存地址

示例如下:

//int array[2][3] = { 1,2,3,4,5,6 };

//等价于

int array[2][3] = { {1,2,3},{4,5,6} };

//数组指针

int(*array_p)[3] = array;

//获取array[1][1]的值

printf("%d\n", array[1][1]);

printf("%d\n", array_p[1][1]);

printf("%d\n", *(*(array_p + 1) + 1));

//指针数组

int* array_p2[3] = { &a,&a,&a };

//获取array_p2[1]的值

printf("%d\n", *array_p2[1]);

在这里我们拆分一下 *(*(array_p + 1) + 1),array_p + 1 表示指针加1(即指针向后移动1),*(array_p + 1) 表示获取指针加1后该指针所指向的内存地址,(*(array_p + 1) + 1) 表示内存地址加1,*(*(array_p + 1) + 1) 表示获取内存地址加1后该内存地址所保存的值。

被 const 修饰的为常量,相当于Java的final。关于被 const 修饰后什么不可变的问题,遵循两个原则:

从右往左看

const无法修饰 *

示例如下:

char tem[] = "hello";

const char* p = tem;//char常量,指针可变,内容不可变

char const* p1 = tem;//同p

char* const p2 = tem;//指针常量,指针不可变,内容可变

const char* const p3 = tem;//char常量指针常量,指针不可变,内容不可变

char const* const p4 = tem;//char常量指针常量,指针不可变,内容不可变

手写 sprintf :

void my_sprintf(char* buffer, char* fmt, ...) {

va_list arg_list;

va_start(arg_list, fmt);

char* b = buffer;

int count = 0;

while (*fmt) {

if (*fmt != '%') {

count++;

*b++ = *fmt++;

continue;

}

fmt++;

switch (*fmt) {

case 'd': {

int i = va_arg(arg_list, int);

int j = 0;

char tmp[10];

int sign = i < 0 ? 1 : 0;

do

{

int r = i % 10;

r = r < 0 ? -r : r;

tmp[j++] = r + '0';

} while (i /= 10);

if (sign)

{

tmp[j++] = '-';

}

while (j > 0)

{

char a = tmp[--j];

*b++ = a;

count++;

}

}break;

default:

printf("xxxxxxx\n");

break;

}

fmt++;

}

buffer[count] = '\0';

va_end(arg_list);

}

CMakeLists.txt

cmake_minimum_required (VERSION 3.8)

include_directories("C:/Users/yby/Desktop/ffmpeg-n4.4-6-g7e9b9f24df-win64-gpl-shared-4.4/include")

link_directories("C:/Users/yby/Desktop/ffmpeg-n4.4-6-g7e9b9f24df-win64-gpl-shared-4.4/lib")

# 将源代码添加到此项目的可执行文件。

add_executable (CMakeProject1 "CMakeProject1.cpp" "CMakeProject1.h")

target_link_libraries(CMakeProject1 avcodec avdevice avfilter avformat avutil postproc swresample swscale)

请记得将dll拷贝到 C:\Windows\System32

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值