通俗的讲指针就是地址,我想这句话只要是学过C语言的都知道,可是我想很多人都还没有真正的理解,
1.指针pStr指向字符串“hello”,但是没有分配内存空间,是可行的,并且字符串“hello”
是存放于字符串常量区,所以当调用Modify(pStr)程序会终止。
2.数组b[] = "hello",在栈中分配的,有程序自动分配及释放,当调用Modify(b)时,修改成功。
3.指针p是通过返回数组首地址,但是数组a[] = "hello",是在栈中分配的,是局部变量。所以它是返回
成功了,内部栈中的机制不太懂,问题是栈是系统自动分配与回收,所以当p = getHead();
运行到下一句时,已经被释放了,p所指向的也就是乱码。
4.我想C/C++中一定讲过要想在子函数中修改传过来的变量值,且能带回去。(1)子函数形参是引用; (2)传地址,
当然这是对的,不过我们在理解指针的时候,也要和基本的变量一样。比如如下的代码:
我想在有的人看来,怎么写这么乱的代码,不过这确实是能说明问题的。
(1)main函数p作为实参传递,init(q)q是形參,只是实参p的拷贝,q是init函数的局部变量,在栈中分配,所以
当在堆中分配内存的时候,分配的是q而不是p,运行发生内存泄漏,程序终止。在unix中输出segmentation fault。当然
想要解决这个问题就可以用二级指针。如下:
这样看上去是不好的,但是是正确的。
我也一样,现在我就指针做一下初步讨论。
#include <stdio.h>
#include <stdlib.h>
char *getHead()
{
char a[] = "hello";
return a;
}
void Modify(char *pT)
{
if (NULL == pT)
{
return;
}
pT[0] = 'o';
}
int main()
{
int i;
char *pStr = "hello";
char b[] = "hello";
char *p = NULL;
p = getHead();
Modify(b);
Modify(pStr);
return 0;
}
如上面的代码:
1.指针pStr指向字符串“hello”,但是没有分配内存空间,是可行的,并且字符串“hello”
是存放于字符串常量区,所以当调用Modify(pStr)程序会终止。
2.数组b[] = "hello",在栈中分配的,有程序自动分配及释放,当调用Modify(b)时,修改成功。
3.指针p是通过返回数组首地址,但是数组a[] = "hello",是在栈中分配的,是局部变量。所以它是返回
成功了,内部栈中的机制不太懂,问题是栈是系统自动分配与回收,所以当p = getHead();
运行到下一句时,已经被释放了,p所指向的也就是乱码。
4.我想C/C++中一定讲过要想在子函数中修改传过来的变量值,且能带回去。(1)子函数形参是引用; (2)传地址,
当然这是对的,不过我们在理解指针的时候,也要和基本的变量一样。比如如下的代码:
#include <stdio.h>
#include <stdlib.h>
void init(char *q,int n){
q = (char*)malloc(n * sizeof(char));
}
int main()
{
char *p = NULL;
init(p);
return 0;
}
我想在有的人看来,怎么写这么乱的代码,不过这确实是能说明问题的。
(1)main函数p作为实参传递,init(q)q是形參,只是实参p的拷贝,q是init函数的局部变量,在栈中分配,所以
当在堆中分配内存的时候,分配的是q而不是p,运行发生内存泄漏,程序终止。在unix中输出segmentation fault。当然
想要解决这个问题就可以用二级指针。如下:
void init(char **q,int n){
*q = (char*)malloc(n * sizeof(char));
}
这样看上去是不好的,但是是正确的。
好吧,就写到这里了,以上的是我的理解。希望看到的人,如果觉得不对可以指出。