无法把指针变量本身传递给一个函数

例1:
#include<stdio.h>
#include<stdlib.h>
void fun(char*p)
{
char c = p[3];//或者是char c=*(p+3);
}
int main()
{
char*p2 = "abcdefg";
fun(p2);
system("pause");
return 0;
}
错误,因为无法把指针变量本身传递给一个函数
应该对实参做一份拷贝并传递给被调用函数,即对p2做一份拷贝,假设其拷贝名为_p2,那传递到函数内部的就是_p2,而并非p2本身。

例2:
void GetMemory(char*p,int num)
{
p = (char*)malloc(num*sizeof(char));
}
int main()
{
char*str=NULL;
GetMemory(str,10);
strcpy(str, "hello");
free(str);
return 0;
}

在运行strcpy(str, "hello")时发生错误,这时候str仍然是NULL,也就是说str本身并没有发生变化,malloc的内存地址并没有赋给str,而是赋给了_str,而_str是编译器自动分配和回收的,我们根本无法使用,所以不能这样获取内存。以下有两种办法:

法一:用return

#include<stdio.h>
#include<stdlib.h>
char*GetMemory(char*p,int num)
{
p = (char*)malloc(num*sizeof(char));
return p;
}
int main()
{
char*str=NULL;
str=GetMemory(str,10);
strcpy(str, "hello");
//free(str);
printf("%s\n", str);
system("pause");
return 0;
}

结果:

hello

请按任意键继续. . .

法二:用二级指针

#include<stdio.h>
#include<stdlib.h>
void GetMemory(char**p,int num)
{
*p = (char*)malloc(num*sizeof(char));
return p;
}
int main()
{
char*str=NULL;
GetMemory(&str,10);
strcpy(str, "hello");
//free(str);
printf("%s\n", str);
system("pause");
return 0;
}

注意,这里的参数是&str而非str,这样传递过去的是str的地址,是一个值,在函数内部,用钥匙("*")来开锁:*(&str),其值就是str。所以malloc分配的内存地址是真正赋值给了str本身

时间: 2024-10-11 17:47:59

无法把指针变量本身传递给一个函数的相关文章

C++静态变量本身可否是一个实例对象

一般书上总是用int来举例,那个太简单.如果静态变量本身可否是一个实例对象呢?应该是可以,但是这样涉及到它的构造函数以及它内部的静态变量如何初始化两个问题,换而言之,这个静态变量本身应该如何初始化?这个问题和单例模式有些关系,回头查查. 以下是一个不成熟的例子,但是能编译运行通过. #include "stdafx.h" #include <iostream> using namespace std; class AAA { public: static int sss;

[C++程序设计]用函数指针变量调用函数

指针变量也可以指向一个函数.一个函数在编译时被分配给一个入口地址.这个函数入口地址就称为函数的指针.可以用一个指针变量指向函数,然后通过该指针变量调用此函数 1 #include <iostream> 2 using namespace std; 3 4 int main() 5 { 6 int max(int,int); 7 int (*p)(int,int); 8 p = max; 9 int m, a, b; 10 cin >> a >> b; 11 m = p(

返回局部指针变量

返回值为数值时,返回局部变量可以,而返回值为引用或指针时,则存在风险. 局部变量是存在于栈中的,函数被调用时先在栈中为变量申请空间,调用完成释放变量空间.函数在返回参数的时候是这样的,先把要返回的数放在寄存器eax中,然后回到主函数中取出eax中的数值放在变量里,所以这样是不涉及函数中变量地址的. 如果要返回引用,也就是变量地址,那么它会把这个变量的地址放在eax中,(注意这个地址是位于函数的栈空间里的,出了这个函数,这块内存就会被系统标记为可占用(就是其它程序可以占用)),回到主函数后系统会把

辨析函数指针变量和指针型函数

在上一篇随笔(顺序表基本操作算法的代码实现)中,LocateElem()函数的第三个形参的形式是: Status (*compare)(Elemtype e,Elemtype temp); 这是一个函数指针变量,借此机会记录一下函数指针变量和指针型函数的区别. 一.写法上的区别 函数指针变量 指针型函数 int (*function)(int i); int  *function(int i){} 上面是一个例子,可看到函数指针变量只是在:*function处比指针型函数多了一对小括号,下面是两

字符串指针变量与字符数组的区别

使用字符串指针变量与字符数组的区别 (1)分配内存 设有定义字符型指针变量与字符数组的语句如下: char *pc ,str[100]; 则系统将为字符数组str分配100个字节的内存单元,用于存放100个字符.而系统只为指针变量pc分配4个存储单元,用于存放一个内存单元的地址.(2)初始化赋值含义 字符数组与字符指针变量的初始化赋值形式相同,但其含义不同.例如: char str[ ] ="I am a student ! " ,s[200]; char *pc="You

[日常] C语言中指针变量

CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址.编译和链接过程的一项重要任务就是找到这些名称所对应的地址. #include <stdio.h> //指针变量测试 //指针变量存储的值是另一个变量的地址,也就是说改指针变量指向了另一个变量 int main(){ int a=10; int c=20; //1.打印出变量的内存地址 printf("%#X \n",(unsig

C语言---指针变量详解1

数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量.在C语言中,允许用一个变量来存放指针,这种变量称为指针变量.指针变量的值就是某份数据的地址,这样的一份数据可以是数组.字符串.函数,也可以是另外的一个普通变量或指针变量. 现在假设有一个 char 类型的变量 c,它存储了字符 'K'(ASCII码为十进制数 75),并占用了地址为 0X11A 的内存(地址通常用十六进制表示).另外有一个指针变量 p,它的值为 0X11A,正好等于变量 c 的地址,这种情况我们

C语言---指针变量详解2

指针变量保存的是地址,本质上是一个整数,可以进行部分运算,例如加法.减法.比较等,请看下面的代码: #include <stdio.h> int main(){ int a = 10, *pa = &a, *paa = &a; double b = 99.9, *pb = &b; char c = '@', *pc = &c; //最初的值 printf("&a=%#X, &b=%#X, &c=%#X\n", &

黑马程序员---C基础9【字符串的输入输出】【字符串相关函数】【指针】【指针变量初始】【二级指针】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- [字符串的输入输出] 1.字符串输出: %s-------从给定的地址开始输出字符直到遇到\0停止: printf("%s\n",&a[3]);  printf("%s\n",a); char a[]="hellowo\0rd!"; 2.字符串输入: 从键盘上接收一个字符串,保存在以a为首地址的字符数组中 scanf("%s&