关于指针的那点事

通俗的讲指针就是地址,我想这句话只要是学过C语言的都知道,可是我想很多人都还没有真正的理解,

我也一样,现在我就指针做一下初步讨论。

#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));
   }

这样看上去是不好的,但是是正确的。


好吧,就写到这里了,以上的是我的理解。希望看到的人,如果觉得不对可以指出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值