指针理解

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<string.h>
#include<stdio.h>

void func1(char** p2) //p2来接收p1的地址
{ 
	*p2 = 400;        //修改p2指向地址存放的数据(修改p1)
}
void func2(char* p2) //p2(一级指针)来接p1(一级指针)
{
	p2 = 500;        //修改p2的值,不会影响p1 要修改p1的数据必须通过二级指针
}
void main()
{

	char *p1 = NULL;   //p1是一级指针,是变量  4B
	char **p2 = NULL;  //p2是二级指针,是变量  4B
	
	p1 = 100;  //p1存放100
	p2 = 200;  //p2存放200
	p2 = &p1;  //p2存放p1的地址

	printf("p1:%d\n",p1);  //100
	
	*p2 = 300;             //修改p2指向地址存放的数据(修改p1)
	printf("p1:%d\n", p1); //200

	func1(&p1);            //p1的地址
	printf("p1:%d\n", p1); //400

	func2(p1);             //p1
	printf("p1:%d\n", p1); //400

	system("pause");
	return ;
}

 

 

 

 2.

int getNum(char **myp1, int *len1 , char  **myp2 , int *len2)
{
	int ret = 0;
	char *p1 = NULL;
	char *p2 = NULL;
	p1 = (char*)malloc(100); //p1开辟内存空间,100字节
	p2 = (char*)malloc(100); //p2开辟内存空间,100字节
	strcpy(p1,"aaaaaaaa"); //向p1指向的内存空间拷贝数据
	strcpy(p2, "abfasfsafas"); 
	*len1 = strlen(p1); //求长度
	*len2 = strlen(p2); 
	*myp1 = p1;   //修改实参的数据(间接赋值)
	*myp2 = p2;  
	return ret;
}
void main()
{
	char *p1 = NULL;
	char *p2 = NULL;
	int len1 = 0;
	int len2 = 0;
	int ret=getNum(&p1,&len1,&p2,&len2);
	if (ret != 0)
	{
		printf("getNum() err");
		return 0;		
	}
	printf("p1:%s\n",p1); //p1为字符串的开始地址 *p1为一个字节,只能用%c输出
	printf("size:%d\n", len1);
	printf("p2:%s\n",p2);  //p2为字符串的开始地址
	printf("size:%d\n", len2);
	if (p1 != NULL)
	{
		free(p1);
		p1 = NULL;
	}
	if (p2 != NULL)
	{
		free(p2);
		p2 = NULL;
	}
	system("pause");
	return 0;
}

 

 

 

3.二级指针做函数输入

#define _CRT_SECURE_NO_WARNINGS
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
//输入数组元素 void printMyArray(char **myArray, int num) //二级指针做输入 接收 指针数组 { int i; for (i = 0; i < num; i++) { //printf("%s",myArray[i]); // myArray[i]代表指针元素 和 *(myArray+i)相同 printf("%s\n", *(myArray+i)); // } return; } //排序 void mySort(char** myArray, int num) //二级指针做输入 { char * tmp = NULL; //tmp指针做中间变量 int i, j = 0; for (i = 0; i < num; i++) //选择排序 { for (j = i; j < num; j++) { if (strcmp(myArray[i], myArray[j]) > 0) { tmp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = tmp; } } } return; } void main() { int num; char* myArray[] = {"aaaaaaaaaaaa","cccccc","bbbbbb","ccccccc","ddddddd"}; //定义一个指针数组,存放指针变量 //printf("%d\n",sizeof(myArray)); //myArray为数组大小 指针4B*5=20 //printf("%d\n", sizeof(myArray[0])); //myArray[0]为第一个指针变量的大小4B num = sizeof(myArray) / sizeof(myArray[0]); //求出指针数组有多少个元素 printf("排序之前\n"); printMyArray(myArray,num); mySort(myArray,num); printf("排序之后\n");
     printMyArray(myArray, num);
     char **p;
	p = (char**)malloc(sizeof(char*)*num); //开辟(char*大小)*num的内存空间,p指向开头
	if (p == NULL)
	{
		return NULL;
	}
	for (int i = 0; i < num; i++)
	{
		p[i] = (char*)malloc(sizeof(char) * 100); 开辟char大小*100字节的内存空间,p[i]分别指向各自的首地址
		sprintf(p[i], "the %d string", num - i);
	}
     printf("排序之前\n");
	printMyArray(myArray,num);
	mySort(myArray,num);
	printf("排序之后\n");
}

 

 

二级指针内存模型

 

 

 

 

 

转载于:https://www.cnblogs.com/sclu/p/11271070.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值