首先,指针和数组完全是两个东西,虽然它们看起来和内存地址的关系很类似!
指针变量:表示指向内存地址的指针,但不是内存地址
数组变量:表示数组的内存首地址
*号在等号(=)左边表示这是指针变量
*号在等号(=)右边表示解引用,即获取指针所指向的内存地址,或获取非指针变量所引用的值
&号表示获取非数组变量的内存地址,由于数组变量原本就表示数组的内存首地址,因此不能用&号去获取数组的内存地址
示例如下:
//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