关于指针的一些看法

这几天复习了指针、数组、函数,所以联系起来可能比较混乱;不多说先上几个例子:

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

void contri(char *str)                         // 这是一个给字符指针分配空间的子函数
{
    str = (char*)malloc(sizeof(char)*64);
}
int main()
{
    char *str = "helloworld";                       //给指针初始化了一下   
    contri(str);  
   // char *str = (char *)malloc(sizeof(char)*64); 
    printf("%s\n",str);
    strcpy(str,"wwwhhhhhhhhhhhhhh");
    printf("%s\n",str);
    return 0;
}

我们把指针str初始化了一下然后进行如上操作;运行一下会出现什么效果呢,以先前的认知或者说是误解我们认为这段代码完全没有问题;不妨运行一下,会提示段错误;

原因大致如下:要用strcpy()函数必须先给指针分配空间,代码中把str直接传过去,传过去的是和"helloworld"首字母h的地址值,形参也是个指针,所以就指向字符串的的那段地址,所以给形参分配空间和实参没有任何关系,就会出现段错误。

要想不出现问题就得把指针的地址传过去,这样在子函数中操作就是对指针地址进行操作,就能改变实参中的指针的空间;修改代码如下:

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

void contri(char **str)
{
    *str = (char*)malloc(sizeof(char)*64);
}
int main()
{
    char *str = "helloworld";
    contri(&str);  
   // char *str = (char *)malloc(sizeof(char)*64); 
    printf("%s\n",str);
    strcpy(str,"wwwhhhhhhhhhhhhhh");
    printf("%s\n",str);
    return 0;
}

 

假如不用参数传递的方式,就直接用注释掉的那段代码,在主函数中直接对指针进行操作。

还有一个例子能很好地证明如果传递的是指针本身,就是啊他初始化的地址传过去,这个是时候能实现通过子函数改变指针内容这个功能主要是因为改变了原有字符串地址里面存放的内容:具体代码如下:

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

void string_revese(char*str,char*ptr)
{
    int len, i;
   len =  strlen(str);
   for(i = 0; i < len;i++)
   {
        *ptr = *(str + len - 1 - i);
        ptr++;
   }
}
int main()
{
    int i;
  
    char *str = "helloworld!";
    char *ptr = (char*)malloc(sizeof(char)*64);

    string_revese(str,ptr);
    printf("%s\n",str);
    printf("%s\n",ptr);
 
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值