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

news/2024/6/3 22:31:01 标签: 指针, 字符串, 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++会把常量字符串存储到单独的一个内存区域,当几个指针
指向同一个字符串的时候,他们实际会指向同一块内存。

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


http://www.niftyadmin.cn/n/611527.html

相关文章

一个SQL语句查询问题(查询最小值

两个表A,BA有ID,NAME等字段B有ID,AID,PRICE等字段注:A.ID关联B.AID 我想按A分类查询B产品的最低价? 假如有数据:A表---------&#…

IPV6 邻居发现协议(NDP)

IPV6除了显著增加了地址空间外,另一个最显著的特征就是它的即插即用性。 邻居发现协议(Neighbor Discovery Protocol,NDP)就是使用以下的功能实现即插即用特性的协议: 路由器发现:当一个节点连接到一个IPV6的链路时,它…

bilibiliclass30_C语言_指针的进阶_指针数组

指针数组 指针数组是一个存放指针的数组。 int* arr1[10]; //存放整形指针的数组-指针数组 char* arr2[4]; //一级存放字符指针的数组-指针数组 char**arr3[5]; //二级存放字符指针的数组-指针数组 使用实例 int arr1{1,2,3,4,5}; int arr2{2,3,4,5,6}; i…

RIP的基本原理与实现

RIP(Routing Information Protocol,路由信息协议)基于UDP520端口,是一种内部网关协议(IGP),是一种动态路由选择协议,用于自治系统(AS)内的路由信息的传递。RIP协议基于距离矢量算法&…

bilibiliclass31_C语言_指针的进阶_数组指针

数组指针 数组指针的定义 数组指针是指针?还是数组? 答案是:指针。 指针的类型 整形指针: int * p; 能够指向整形数据的指针,可以存放整形的地址 字符指针: char * p;能够指向字符数据的指针,可以存放字符的地址 浮…

bilibili大学_C语言作业_day01

特别:注册自己的csdn博客。 1. 打印100~200之间的素数 2. 输出乘法口诀表 3. 判断1000年---2000年之间的闰年 4. 写一篇博客。谈谈 1>写一个自我介绍 2>列出你编程的目标。 3>你打算怎么学习编程? 4>你打算在学习编程这件事上每周花费多少…

RHEL7的磁盘配额

磁盘管理的概念: Linux系统是多用户任务操作系统,在使用系统时,会出现多用户共同使用一个磁盘的情况,如果其中少数几个用户占用了大量的磁盘空间,势必压缩其他用户的磁盘的空间和使用权限。因此,系统管理员…

bilibili大学_C语言作业_day02

作业: 1. 给定两个整形变量的值,将两个值的内容进行交换。 2. 不允许创建临时变量,交换两个数的内容(附加题) 3.求10 个整数中最大值。 4.将三个数按从大到小输出。 5.求两个数的最大公约数。