C语言(四)二级指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}


 

猜你喜欢

转载自blog.csdn.net/qq_40818798/article/details/86561708