bilibiliclass30_C语言_指针的进阶_字符指针

指针的进阶目录

1. 字符指针
2. 数组指针
3. 指针数组
4. 数组传参和指针传参
5. 函数指针
6. 函数指针数组
7. 指向函数指针数组的指针
8. 回调函数
9. 指针和数组面试题的解析

指针

1. 指针就是个变量,用来存放地址,地址唯一标识一块内存空间。
2. 指针的大小是固定的4/8个字节(32位平台/64位平台)。
3. 指针是有类型,指针的类型决定了指针的+-整数的步长,指针解引用操作的时候访问的字节个数。
4. 指针的运算。

 

字符指针

在指针的类型中我们知道有一种指针类型为字符指针 char* ;
一般使用:

int main()
{
   char ch = 'w';
   char* pc = &ch;
   *pc = 'w';
   return 0;
}

通过指针打印字符串
 

int main()
{
    char arr[]="abcdef";
    char* pc=arr;
    printf("%s\n",arr);
    printf("%s\n",pc);
    return 0;
}

/*
结果:
abcdef
abcdef
*/

常量字符串

int main()
{
    char* p="abcdef";//"abcdef\0"是一个常量字符串,p中存的是a的地址
    //本质是把字符串 abcdef 首字符的地址放到了p中
    printf("%c\n",*p);//a
    printf("%s\n",p);//abcdef
    return 0;
}

错误写法

尝试修改常量字符串
err:Segmentation fault - 段错误

int main()
{
    char* p="abcdef";//"abcdef\0"是一个常量字符串,p中存的是a的地址
    *p = 'W';//常量字符串不可以改,正确的写法应该在char* p前面加const
    printf("%s\n",p);
    return 0;
}


例题:

请问打印结果是什么?
 

int main()
{
    char arr1[]="abcdef";
    char arr2[]="abcdef";
    char * p1="abcdef";
    char * p2="abcdef";
    if(arr1==arr2)
    {
        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }
    if(p1==p2)
    {
        printf("hehe\n");
    }
    else
    {
        printf("haha\n");
    }
}

结果:

haha,首元素的地址

hehe,常量字符串只有一份

解析:
这里p1和p2指向的是一个同一个常量字符串。
C/C++会把常量字符串存储到单独的一个内存区域,当几个指针。
指向同一个字符串的时候,他们实际会指向同一块内存。

但是用相同的常量字符串去初始化不同的数组的时候就会开辟出不同的内存块。
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值