版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40818798/article/details/86561708
目录
一、二级指针初探
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
int a = 10;
int *p = &a;
int **pp = &p;
printf("&a : %p\n", &a);
printf("p : %p\n", p);
printf("&p: %p\n", &p);
printf("pp: %p\n", pp);
printf("&pp: %p\n", &pp);
printf("*p: %d\n", *p);
printf("*pp:%p\n", *pp);
printf("**pp:%d\n", **pp);
return 0;
}
二、通过二级指针间接修改一级指针指向
- 推广:可通过N级指针间接修改N-1级指针指向
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void change(int *p)
{
p = 200;
}
void change2(int **p)
{
*p = 200;
}
int main()
{
int *p=NULL;
p = 100;
printf("%d ", p);
change(&p);
printf("%d ", p);
change2(&p);
printf("%d ", p);
}
三、二级指针三种常见形式
- 指针数组
- 二维数组
- 自定义的二维内存
四、二级指针做函数参数
-
输出参数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//二级指针作为输出参数
//在函数内部 在堆上开辟空间 传出去。
int get_mem(/*out */char **mem1, int *mem_len1, char **mem2, int *mem_len2)
{
char *temp_p1 = NULL;
char *temp_p2 = NULL;
int len1 = 0;
int len2 = 0;
if (mem1 == NULL || mem2 == NULL || mem_len1 == NULL || mem_len2 == NULL)
{
fprintf(stderr, " (mem1 == NULL || mem2 == NULL || mem_len1 == NULL || mem_len2 == NULL) \n");
return -1;
}
temp_p1 = (char *)malloc(4096);
if (temp_p1 == NULL)
{
return -1;
}
memset(temp_p1, 0, 4096);
strcpy(temp_p1, "12345678");
len1 = strlen(temp_p1);
temp_p2 = (char*)malloc(4096);
if (temp_p2 == NULL)
{
return -1;
}
memset(temp_p2, 0, 4096);
strcpy(temp_p2, "abcdefg");
len2 = strlen(temp_p2);
//以上开辟完空间
*mem1 = temp_p1;
*mem2 = temp_p2;
*mem_len1 = len1;
*mem_len2 = len2;
return 0;
}
void free_mem(char **mem1, char **mem2)
{
char *temp_mem1 = *mem1;
char *temp_mem2 = *mem2;
if (mem1 != NULL)
{
free(temp_mem1);
}
if (mem2 != NULL)
{
free(temp_mem2);
}
*mem1 = NULL;
*mem2 = NULL;
}
int main(void)
{
char *buf1 = NULL;
char *buf2 = NULL;
int len1 = 0;
int len2 = 0;
if (get_mem(&buf1, &len1, &buf2, &len2) < 0)
{
return -1;
}
printf("buf1: %s\nbuf2:%s\n", buf1, buf2);
free_mem(&buf1, &buf2);
return 0;
}
-
输入参数
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//int print_array(char* array[], int len)
int print_array(char* *array, int len)
{
int i = 0;
for (i = 0; i < len; i++)
{
//printf("%s\n", array[i]);
printf("%s\n", *(array + i));
}
return 0;
}
int sort_array(char *array[], int len)
{
int i = 0;
int j = 0;
char *temp = NULL;
for (i = 0; i < len-1; i++)
{
for (j = i+1; j < len; j++)
{
if (strcmp(array[i], array[j]) > 0)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
}
return 0;
}
int main(void)
{
char * myArray[] = { "aaaaaa", "ccccc", "bbbbbb", "111111" };
int len = 0;
len = sizeof(myArray) / sizeof(myArray[0]); // 16 / 4 = 4个
printf("排序之前\n");
print_array(myArray, len);
//排序
sort_array(myArray, len);
printf("排序之后\n");
print_array(myArray, len);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//int print_array(char * *array, int num)
//int print_array(char array[5][6], int num)
//int print_array(char[6]* array, int num)
int print_array(char array[][6], int num) //int print_array(char (*array)[6], int num)
{
int i = 0;
for (i = 0; i < num; i++) {
//printf("%s\n", array[i]); //my_array[0]; my_array[0]--->"aaa" printf(%s, myArray[0]);
printf("%s\n", *(array + i)); /// ===>array 应该是一个指向 char[6]的指针
}
return 0;
}
int sort_array(char array[][6], int num)
{
char buf[6] = { 0 };
int i = 0;
int j = 0;
for (i = 0; i < num; i++)
{
for (j = i; j < num; j++)
{
if (strcmp(array[i], array[j]) > 0)
{
strcpy(buf, array[i]);
strcpy(array[i], array[j]);
strcpy(array[j], buf);
}
}
}
return 0;
}
int main(void)
{
char my_array[5][6] = { "aaa", "ccc", "bbb", "111" };
int num = 0;
int i = 0;
for (i = 0; i < 5; i++)
{
if (strlen(my_array[i]) != 0)
{
num++;
}
}
printf("num : %d\n", num);
printf("排序之前\n");
print_array(my_array, num);
sort_array(my_array, num);
printf("排序之后\n");
print_array(my_array, num);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char ** get_mem(int num)
{
char **array = NULL;
int i = 0;
array = (char**)malloc(sizeof(char*)* num);//在堆上开辟num个 char*指针
if (array == NULL) {
fprintf(stderr, "malloc char **array error\n");
return NULL;
}
memset(array, 0, sizeof(char*)*num);
for (i = 0; i < num; i++) {
array[i] = (char*)malloc(64);
if (array[i] == NULL) {
fprintf(stderr, "maloc array[%d] error\n", i);
return NULL;
}
//赋值
sprintf(array[i], "%d%d%d%d", 9 - i, 9 - i, 9 - i, 9 - i);
}
return array;
} //main::my_array = array;
void free_mem(char **array, int num)
{
char **temp_array = array;
int i = 0;
if (array == NULL)
return;
for (i = 0; i < num; i++)
{
if (temp_array[i] != NULL)
{
free(temp_array[i]);
temp_array[i] = NULL;
}
}
free(temp_array);
}
int print_array(char **array, int num)
{
int i = 0;
for (i = 0; i < num; i++)
{
printf("%s\n", *(array + i));
//printf("%s\n", array[i]);
}
return 0;
}
int sort_array(char **array, int num)
{
int i = 0;
int j = 0;
char* temp = NULL;
for (i = 0; i < num; i++)
{
for (j = i; j < num; j++)
{
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}
return 0;
}
int main(void)
{
char **my_array = NULL;
//通过堆开辟一个 字符串数组
int num = 4;
my_array = get_mem(num);
if (my_array == NULL)
{
fprintf(stderr, "get_mem err\n");
return -1;
}
print_array(my_array, num);
printf("------\n");
sort_array(my_array, num);
print_array(my_array, num);
free_mem(my_array, num);
my_array = NULL;
return 0;
}
五、三级指针用法
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int get_mem(char ***array_p, int num)
{
char **array = NULL;
int i = 0;
array = (char**)malloc(sizeof(char*)* num);//在堆上开辟num个 char*指针
if (array == NULL) {
fprintf(stderr, "malloc char **array error\n");
return -1;
}
memset(array, 0, sizeof(char*)*num);
for (i = 0; i < num; i++) {
array[i] = (char*)malloc(64);
if (array[i] == NULL) {
fprintf(stderr, "maloc array[%d] error\n", i);
return -1;
}
memset(array[i], 0, 64);
//赋值
sprintf(array[i], "%d%d%d%d", 9 - i, 9 - i, 9 - i, 9 - i);
}
*array_p = array;
return 0;
}
void free_mem(char ***array_p, int num)
{
int i = 0;
if (array_p == NULL) {
return;
}
char **array = *array_p;
for (i = 0; i < num; i++)
{
if (array[i] != NULL)
{
free(array[i]);
array[i] = NULL;
}
}
free(array);
*array_p = NULL;
}
int main(void)
{
char **my_array = NULL;
int num = 4;
get_mem(&my_array, num);
printf("-----\n");
free_mem(&my_array, num);
if (my_array == NULL)
{
printf("kong\n");
}
return 0;
}