【新手求助】关于c语言指针操作的问题

我在动态分配的内存里保存了另一个变量的地址,然后再打印这个动态分配的内存和另一个变量地址。 group2里面 base和*p3的地址是一样的,这个我理解,可是为什么 group1里的 buf和 *p不一样呢?

#include <stdio.h>

int main(int argc, char const *argv[])
{
// group1
char buf[]="hello";
char *p=(char *)malloc(sizeof(char *));
*p=buf;
printf("buf=%p\n", buf);
printf("*p=%p\n", *p);

// group2
int base=1;
int *p3=(int *)malloc(sizeof(int *));
*p3=&base;
printf("base=%p\n", &base);
printf("*p3=%p\n", *p3);

return 0;
}

原来的程序是不能通过编译的。
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
// group1
char buf[]="hello";
char *p=(char *)malloc(sizeof(char ));    //只要char *p;即可
p=buf;
printf("buf=%p\n", buf);
printf("*p =%p\n", p);

// group2
int base=1;
int *p3=(int *)malloc(sizeof(int *));    //只要int *p3;即可
p3=&base;
printf("base=%p\n", &base);
printf("*p3 =%p\n", p3);

return 0;
}

追问

那怎么让(char *)malloc(sizeof(char ));这块内存变成一个指针变量指向另一块内存呢?

追答

你说的是“申请一个指针变量的空间”,用于存放一个指针吧?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char const *argv[])
{
// group1
char buf[]="hello";
char **p=(char **)malloc(sizeof(char *));
*p=buf;
printf("buf=%p\n", buf);
printf("*p =%p\n", *p);

// group2
int base=1;
int *p3=(int *)malloc(sizeof(int *));
p3=&base;
printf("base=%p\n", &base);
printf("*p3 =%p\n", p3);

return 0;
}

追问

哦,我明白了。group2如果要申请一个指针变量的空间需要这样写?
// group2
int base=1;
int **p3=(int **)malloc(sizeof(int *));
*p3=&base;
printf("base=%p\n", &base);
printf("*p3 =%p\n", *p3);
意思就是说申请一个指针变量的空间需要用一个二级指针来接收是嘛?

追答

对的,就是这样的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-09-26
在group1中,*p=buf;这连编译都不应该通过,因为*p是char类型,而buf是char *类型。如果你的编译器能通过,那多少应该有山寨之嫌……追问

为什么*p是char类型的呀?分配内存的时候我明明给了他char *啊,malloc(sizeof(char *))。

C语言新手求助---
int *pa[] 指针数组,也可写成 int *(pa[])int (*pa)[] 数组指针 int *pf() 返回指针的函数,也可写成int *(pf())int (*pf)() 指向函数的指针

C语言 求帮助,下面的一段代码为什么q=&p;为什么出错,求修改!!!_百度知...
p与q都是指针不能用q=&p应该改为p=q;

C语言新手求助.string.h
正确的做法是用双引号 字符也是一样 比如 strcmp("hello","world");也可以定义两个字符指针变量 char *str1 = "hello";char *str2 = "world";strcmp(str1,str2);

C语言中删除指针用啥?
2012-12-08 C语言 输入一个字符串 利用指针 删除它的空格字符~ 16 更多类似问题 > c语言的相关知识2011-02-24 c语言指针 27 2010-06-11 C语言删除文件问题 69 2011-05-07 C语言程序设计试题 336 2011-02-27 c语言编程软件 160 2011-03-13 C语言 指针 9 更多关于c语言的知识 > 正在求助 换一...

请教C语言中(*p)++与*p++与++*p与*++p的区别
\/\/它相当于*(p++),首先指针p后移,由于对指针是后缀加,所以p++返回p没后移时的指针,如果是数组,那么表达式的值为指针当前所指元素(指针没有后移时)的值++*p\/\/即相当于++(*p),先取p所指向的值,然后施以前缀加,则该表达式的值为p当前所指对象的值+1的结果。*++p\/\/相当于*(++p),指针p先后移,如果是...

求助一个C语言问题 为什么在VC中老是提示我 warning C4101: 'c...
警告的意思为:警告C4101:'e':未引用的局部变量 原因是局部变量的错误使用。你的 f,c,k都是在main()函数里面定义的,然而,你在使用这些变量时是在temp()函数里面,在某个函数里面定义的变量只能在此函数中使用,所以你会产生错误。解决办法为,将这些变量定义为全局变量。问题成功解决。

C++中指针的赋值操作
为您推荐: A=a-b赋值 c语言指针变量 指针可以被赋值么 指针& .指针 给指针赋值 什么是指针赋值 指针的合法赋值 为指针的位置赋值 赋值语句 其他类似问题2014-02-20 C++类指针成员的赋值操作 3 2013-05-14 c++中给一个对象的指针赋值 2013-04-16 C++整型指针赋值的问题 2010-04-15 关于...

求助!C语言用指针函数实现十进制转,十六进制,八进制,二进制
include"stdio.h"define MAX 100 typedef struct s { int yushu[MAX];int top;}SqStack;SqStack *s;int n,jinzhi,m;void transform();void output(SqStack *s);int main(){ printf("计算机0904 16号 林夏飞\\n***\\n");s=(SqStack*)malloc(sizeof(SqStack));s->top = -1;printf(...

C语言(指针): 编写一个函数实现n*n矩阵转置。在主函数中用scanf输入...
也只能对上三角元素操作,是因为a[][]数组本身空间的限制,如果采用指针的话:令p=a;其他注意是对内容**p之类操作即可。不过如果采用引入矩阵b来操作可以完美解决上述问题:void fun( float a[][],float b[][]){ int i,j;for(i=0;a[i][0];i++)for(j=0;a[i][j];j++){b[j][i]=a[i][j]...

二元一次方程组的解法 VC++ C语言新手求助
在他晕过去的前一秒钟 他瞥见小C的手表 指针停在了1点...就是小C进去的那个时候...顺便说一下 他们去探险的那天晚上 并没有门卫...将此贴转向5个以上的论坛不会魔鬼缠身且能实现一个愿望 。不回帖者晚上凌晨过后往往...对不起,我很不情愿,但是...请各位原谅 ...

相似回答