// zhizheng.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
void test01()
{
printf("%lu\n", sizeof(char*));
printf("%lu\n", sizeof(short*));
printf("%lu\n", sizeof(int*));
printf("%lu\n", sizeof(long*));
printf("%lu\n", sizeof(float*));
printf("%lu\n", sizeof(double*));
printf("%lu\n", sizeof(int*******));
}
void test02()
{
int num = 10;
int* p;
p = #
printf("p = %p\n", p);
printf("&num = %p\n", &num);
printf("*p = %d\n", *p);
printf("num = %d\n", num);
}
void test03()
{
int num = 0x01020304;
int* p1 = #
short* p2 = (short*)& num;
char* p3 = (char*)& num;
printf("%#x\n", *p1);
printf("%#x\n", *p2);
printf("%#x\n", *p3);
printf("%#x\n", *(p1 + 1));
printf("%#x\n", *(p2 + 1));
printf("%#x\n", *(p3 + 1));
}
void test04()
{
int* p1 = NULL;
printf("p1 = %p\n", p1);
printf("p1 = %p\n", p1 + 1);
short* p2 = NULL;
printf("p2 = %p\n", p2);
printf("p2 = %p\n", p2 + 1);
char* p3 = NULL;
printf("p3 = %p\n", p3);
printf("p3 = %p\n", p3 + 1);
}
void test05()
{
int num = 0x01020304;
short* p1 = (short*)& num;
printf("p1 = %#x\n", *(p1 + 1));
char* p2 = (char*)& num;
printf("p2 = %#x\n", *(p2 + 2));
char* p3 = (char*)& num;
printf("p4 = %#x\n", *(short*)(p3 + 1));
}
void test06()
{
int num = 0;
int* p = #
//scanf("%d", &num);
scanf("%d", p);
printf("num = %d\n", num);
*p = 100;
printf("num = %d\n", num);
(*p)++; //*p = *p + 1;
printf("num = %d\n", num);
}
void test07()
{
void* p = NULL;
printf("p = %p\n", p);
printf("p = %d\n", sizeof(p));
int num = 10;
void* p1 = #
short data = 20;
printf("p1 = %p\n", p1);
printf("*p1 = %d\n", *(char*)p1);
printf("*p1 = %d\n", *(short*)p1);
printf("*p1 = %d\n", *(int*)p1);
}
//数组元素的指针变量 p
void test08()
{
int arr[5] = { 10, 20, 30, 40, 50 };
int* p;
p = arr; //arr == &arr[0];
p = &arr[2];
//通过指针来操作数组的对应元素
printf("*p = %d\n", *p);
printf("*p-1 = %d\n", *(p - 1));
printf("*p+1 = %d\n", *(p + 1));
printf("*arr+1 = %d\n", *(arr + 1));
//通过指针来遍历数组的元素
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
for (int i = 0; i < n; i++)
{
printf("%d ", *(arr + i));
}
printf("\n");
for (int i = 0; i < n; i++)
{
printf("%d ", i[arr]);
}
printf("\n");
for (int i = 0; i < n; i++)
{
printf("%d ", *(p + i));
}
printf("\n");
printf("arr[1] = %d\n", arr[1]);
printf("*(arr + 1) = %d\n", *(arr + 1));
printf("*(1 + arr) = %d\n", *(1 + arr));
printf("1[arr] = %d\n", 1[arr]);
//arr == &arr[0];//?
//&arr[0] == &*(arr + 0) == arr;
}
//字符串的指针变量
void test09()
{
char str1[128] = "Hello World";
const char* str2 = "Hello World";
printf("%d\n", sizeof(str1));
printf("%d\n", sizeof(str2));
printf("%s\n", str1);
printf("%s\n", str2);
str1[6] = 'w';
//str2[6] = 'w'; //error
printf("%c\n", str1[6]);
printf("%c\n", str2[6]);
}
//指针数组
void test10()
{
char* arr1[5];
short* arr2[5];
int* arr3[5];
printf("%d\n", sizeof(arr1));
printf("%d\n", sizeof(arr2));
printf("%d\n", sizeof(arr3));
//1.数值的指针数组
int num1 = 10, num2 = 20, num3 = 30, num4 = 40;
int* arr[4] = { &num1, &num2, &num3, &num4 };
int n = sizeof(arr) / sizeof(arr[0]);
//通过指针数组来操作数组每个元素地址所对应的值
for (int i = 0; i < n; i++)
{
printf("%d ", *arr[i]);
}
printf("\n");
//2.字符的指针数组
const char* str[4] = { "hahaha", "hehehe", "lalala", "yiyiyi" };
int m = sizeof(str) / sizeof(str[0]);
for (int i = 0; i < m; i++)
{
printf("%s ", str[i]);
}
printf("\n");
char* str1[4]; //str1是指针数组,存放的是每个字符串的首元素地址
char str2[4][128]; //str2是二维字符数组,存放的是每个字符串
}
//数组指针
void test11()
{
int arr[5] = { 10, 20, 30, 40, 50 };
printf("arr = %u\n", arr);
printf("arr + 1 = %u\n", arr + 1);
printf("&arr = %u\n", &arr);
printf("&arr + 1 = %u\n", &arr + 1);
int(*p1)[5] = NULL;
printf("%lu\n", sizeof(p1));
printf("p1 = %u\n", p1);
printf("p1 + 1 = %u\n", p1 + 1);
//通过数组指针来操作数组中元素的值
int(*p)[5] = &arr;
printf("arr[2] = %d\n", *(*p + 2));
printf("%d\n", *((int*)(p + 1) - 2));
p == &arr;
*p == arr;
arr[2] == *(arr + 2) == *(*p + 2) == *(*(p + 0) + 2) == *(p[0] + 2) == p[0][2];
}
void test12()
{
int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int row = sizeof(arr) / sizeof(arr[0]);
int col = sizeof(arr[0]) / sizeof(arr[0][0]);
int* p = &arr[0][0];
for (int i = 0; i < row * col; i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
//指针变量作为函数的参数
void set_data(int* p);
void test13()
{
int num = 0;
set_data(&num);
printf("%d\n", num);
}
void set_data(int* p)
{
*p = 100;
}
//数组作为函数的参数
void printf_int_array(int* p, int n);
void test14()
{
int arr[5] = { 10, 20, 30, 40, 50 };
int n = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", sizeof(arr));
printf_int_array(arr, n);
}
void printf_int_array(int* p, int n)
{
printf("%d\n", sizeof(p));
for (int i = 0; i < n; i++)
{
printf("%d ", p[i]);
}
printf("\n");
}
//求数组最大值和最小值
void input_int_array(int* p, int n)
{
for (int i = 0; i < n; i++)
{
scanf("%d", p + i);
}
}
void get_max_min_data(int* p, int* max, int* min, int n)
{
*max = *min = p[0];
for (int i = 1; i < n; i++)
{
if (*max < p[i])
{
*max = p[i];
}
else if (*min > p[i])
{
*min = p[i];
}
}
}
void test15()
{
int arr[5] = { 0 };
int n = sizeof(arr) / sizeof(arr[0]);
input_int_array(arr, n);
int max = 0, min = 0;
get_max_min_data(arr, &max, &min, n);
printf("max = %d, min = %d\n", max, min);
}
//数组元素值向前进1
void my_fun(int* p)
{
p[0] = p[1];
}
void test16()
{
int arr[5] = { 10, 20, 30, 40, 50 };
int n = sizeof(arr) / sizeof(arr[0]);
for (int i = 0; i < n - 1; i++)
{
my_fun(arr + i);
}
for (int i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
printf("\n");
}
//二维数组作为函数的参数
void printf_int_two_array(int(*arr)[4], int row, int col)
{
printf("sizeof(arr) = %lu\n", sizeof(arr));
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
//printf("%d ", arr[i][j]);
printf("%d ", *(*(arr + i) + j));
}
printf("\n");
}
}
void test17()
{
int arr[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 };
int row = sizeof(arr) / sizeof(arr[0]);
int col = sizeof(arr[0]) / sizeof(arr[0][0]);
printf("sizeof(arr) = %d\n", sizeof(arr));
printf_int_two_array(arr, row, col);
}
//函数的返回值为指针类型
int* get_addr()
{
static int num = 10;
return #
}
void test18()
{
int* p = NULL;
p = get_addr();
printf("*p = %d\n", *p);
}
void get_addr(int** q)
{
static int num = 20;
//q = &p;
//*q = p;
//p = #
*q = #
}
void test19()
{
int* p = NULL;
get_addr(&p);
printf("*p = %d\n", *p);
}
//函数指针
int my_add(int x, int y)
{
return x + y;
}
void test20()
{
int (*p)(int, int) = NULL;
printf("%d\n", sizeof(p));
p = my_add;
(**********printf)("%d\n", (*********p)(10, 30));
}
//函数指针类型
void test21()
{
typedef int (*FUN_TYPE)(int, int);
FUN_TYPE p = my_add;
printf("%d\n", sizeof(p));
(**********printf)("%d\n", (*********p)(10, 30));
}
void test22()
{
printf("%#x\n", my_add);
//int ret = my_add(10, 20);
int ret = ((int (*)(int, int))0x831424)(10, 20);
printf("%d\n", ret);
}
//函数指针作为函数的参数
int my_sub(int x, int y)
{
return x - y;
}
int my_mul(int x, int y)
{
return x * y;
}
int my_div(int x, int y)
{
return x / y;
}
int my_calc(int a, int b, int (*func)(int, int))
{
return func(a, b);
}
void test23()
{
printf("%d\n", my_calc(40, 20, my_add));
printf("%d\n", my_calc(40, 20, my_sub));
printf("%d\n", my_calc(40, 20, my_mul));
printf("%d\n", my_calc(40, 20, my_div));
}
//函数指针数组
void test24()
{
const char* cmd_buf[] = { "add", "sub", "mul", "div" };
int n = sizeof(cmd_buf) / sizeof(cmd_buf[0]);
int (*fun_arr[])(int, int) = { my_add, my_sub , my_mul , my_div };
while (1)
{
printf("请输入计算格式:add 10 20:");
char cmd[16] = "";
scanf("%s", cmd);
if (!strcmp(cmd, "quit"))
break;
int data1 = 0, data2 = 0;
scanf("%d %d", &data1, &data2);
for (int i = 0; i < n; i++)
{
if (!strcmp(cmd_buf[i], cmd))
{
//printf("结果:%d\n", my_calc(data1, data2, fun_arr[i]));
printf("结果:%d\n", fun_arr[i](data1, data2));
break;
}
}
}
}
void test25()
{
int arr[5] = { 1, 2, 3, 4, 5 }; //int类型一维数组
int* p = arr; //数组元素的指针变量
char str1[128] = "Hello world"; //字符数组,保存的每个元素为字符
const char* str2 = "Hello world"; //字符串指针变量,保存的是字符串的首元素地址
//指针数组,数组的每个元素为指针
int* arr1[3] = { (int*)10, (int*)20, (int*)30 }; //数值的指针数组,每个元素为int*
const char* arr2[4] = { "aa", "bb", "cc", "dd" }; //字符指针数组,每个元素为char*
char arr3[4][128] = { "aa", "bb", "cc", "dd" }; //二维字符数组,每个元素为字符串
//数组指针,保存的是数组的首地址
int arr4[3][5]; //二维数组
int(*p1)[5] = &arr; //一维数组指针
p1 = arr4; //二维数组名和一维数组指针完全等价
//指针变量作为函数的参数
void func1(int* p);
//一维数组作为函数的参数,n维数组等价于n-1维的数组指针
void func2(int p[]);
void func2(int *p);
//二维数组作为函数的参数,n维数组等价于n-1维的数组指针
void func3(int p[5][3]);
void func3(int(*p)[3]);
//函数指针
int (*func4)(int, int) = NULL;
func4 = my_add;
//函数指针类型
typedef int (*FUNC4)(int, int);
FUNC4 func5 = my_add;
//函数指针作为函数参数
int my_func(int a, int b, int (*p)(int, int));
}
int main()
{
test24();
return 0;
}
C 语法 - 07_指针详解
于 2023-01-08 14:21:05 首次发布