- 主调函数可以把栈区、堆区、全局区的数据地址传给被调函数;被调函数只能返回堆区和全局区的数据及地址。
- 指针作为函数的传入参数,由主调函数分配内存;指针作为函数的输出时,由被调函数分配内存。
- 如果想通过形参改变实参的内容,必须地址传递(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;
}