C语言指针知识点(二):指针在函数的输入、输出时 的性质

  1. 主调函数可以把栈区、堆区、全局区的数据地址传给被调函数;被调函数只能返回堆区和全局区的数据及地址。
  2. 指针作为函数的传入参数,由主调函数分配内存;指针作为函数的输出时,由被调函数分配内存。
  3. 如果想通过形参改变实参的内容,必须地址传递(C中,C++中还可以通过引用的方式)。
#include "stdafx.h"
#include <iostream>

void fun1(char * s)
{
	strcpy_s(s,sizeof("lemon1"), "lemon1");//给指针所指区域拷贝字符串常量
}

void fun2(char * s)
{
	//strcpy_s(s, sizeof("lemon2"), "lemon2");//给指针所指区域拷贝字符串常量,
					//但主调函数未分配内存,出错
}

void fun3(char **s, int *n)
{
	char *p = (char *)malloc(50);//定义一个指针p,指向堆区,分配其50字节大小
	strcpy_s(p, sizeof("lemon3"), "lemon3");////给指针p所指区域拷贝字符串常量
	*s = p;//将指针p的地址值赋给形参,改变的是实参的值
	*n = strlen(p);//将长度值赋给形参所指向位置,改变实参的值
}

char * fun4()
{
	char *p = "lemon4";//常量区字符串地址赋给p
	return p;//返回p的值(地址值)
}

int main()
{
	system("color 02");

	//1.主调函数分配指针指向的内存,传入被调函数
	char str1[50] = { 0 };//定义一个字符数组,即字符串
	fun1(str1);//调用函数,传入指针
	printf("str1:%s\n", str1);//输出字符串

	//2.主调函数未分配指针指向的内存,传入被调函数,结果出错
	char *str2 = NULL;//定义一个指针,并初始化,但未分配内存
	fun2(str2);//调用函数,传入指针
	if (str2 != NULL)
	{
		printf("str2:%s\n", str2);
	}
	
	//3.主调函数定义指针,传入被调函数,被调函数分配内存并输出
	char *str3 = NULL;//定义一个指针,并初始化,但未分配内存
	int len = 0;//定义字符串长度,初始化为0
	fun3(&str3,&len);//调用函数,传入指针
	if (str3 !=  NULL)
	{
		printf("str3:%s\tlen:%d\n", str3,len);//输出字符串
            free(str3);//输出后释放堆区内存
            str3=NULL;
	}
	
	//4.将2做点修改,主调函数未分配指针指向的内存,传入被调函数,
	//被调函数分配内存,返回指针
	char *str4 = NULL;//定义一个指针,并初始化,但未分配内存
	str4=fun4();//调用函数,函数返回值(地址)赋给str4
	if (str4 != NULL)
	{
		printf("str4:%s\n", str4);//输出字符串
	}

	printf("\n");
	system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Lemon_jay/article/details/82930737
今日推荐