首页 > 其他分享 >简答理解【字符指针】,存放字符串首地址???

简答理解【字符指针】,存放字符串首地址???

时间:2024-07-23 21:55:23浏览次数:9  
标签:printf 字符 打印 地址 简答 abcdefg 字符串 指针

2024-07-23 笔记 - 5
作者(Author): 仟濹(网名)

字符指针

① 定义指针的时候也赋值字符串

为什么给一个指针赋值字符串的时候也可以打印出来整个字符串???

//eg:
char* p = "abcdefg";
printf("%s", p);//abcdefg
puts( p );//同理

printf("%s", p + 1);//bcdefg
puts(p + 1);//同理

首先明白一点,给一个指针赋值字符串的时候,相当于将第一个字符的地址赋值给了该指指针,而这几个字符串又是连续的,在打印字符串的时候,就是根据地址连续性打印的,从前往后打印,只要遇到 \0 就会停止打印。abcdefg是常量字符串。

可以更改字符串 abcdefg 中的字符吗???
不可以,不会报错,但是编译器会挂掉(就是编译器会突然停止工作),因为这个字符串是不可更改的存在

char* p = "abcdefg";
*p = 'm';?//不报错,但是编译器停止运行

如果想让它会报错,用来提示不可更改,可以如下操作~

这样操作就会变得严谨一些

const char* p = "abcdefg";
//Or
const char const *p = "abcdefg";
*p = 'm';//如果是以上这两种定义,下面进行赋值的时候就会报错了

疑惑点:

  • 用%s打印p的时候,打印的是字符串,如果是用%c打印*p,是否可以打印出第一个字符???

    可以

  • 如果用字符串的形式打印出来某个字符,格式为printf("%s\n", &ch2);,是否可以打印出来这个字符??

    可以,但是这种方式是不正确的,可能会出问题,只是疑惑,试一下能否这样打印。

  • 如果两个字符变量的地址是连续的,用%s的形式打印出第一个字符,格式为printf("%s", &ch);,是否可以将第二个字符也打印出来???

    可以,但是这种方式是不正确的,可能会出问题,只是疑惑,试一下能否这样打印

下面进行详细的解释和说明,也为了自己更深一步的理解~

//疑惑点,打印用%s打印p的时候,打印的是字符串
//如果用%c打印*p,能否打印出a
#include <stdio.h>
int main()
{
    char* p = "abcdefg";
    printf("%s\n", p);//abcdefg
    printf("%c\n", *p);//a
    
    char ch = 'm';//ch和ch2字符的地址连续的
    char ch2 = 'n'; //测试如果两个变量是连续定义的(地址是连续的),将m按照字符串的形式打印的时候,能否将n打印出来???
    printf("%s\n", &ch);//mn
   
    //测试如果用%s打印出一个字符的地址(后面没有连续的字符),可以打印出字符串吗???
    printf("%s", &ch2);//n
    
    return 0;
}

总结:
① 字符地址是连续的,存储的是 a b c d e f g \0
② p 中存储的是第一个字符的地址,即首字符 a 的地址。
③ p中可不是存储的整个字符传的地址
abcdefg是存储在常量区(只读数据段),所以是不可更改的。

② 字符指针的坑
const char* p1 = "abcdefg";
const char* p2 = "abcdefg";

if(p1 == p2)
    printf("p1 和 p2 存储的地址相同");
else
	printf("p1 和 p2 存储的地址不同");

char arr1[] = "abcdefg";
char arr2[] = "abcdefg";

if(arr1 == arr2)
    printf("arr1 和 arr2 存储的地址相同");
else
	printf("arr1 和 arr2 存储的地址相同");

答案可不是都不相同,我刚开始以为是都不相同,是我想错了
p1 和 p2 中存储的地址是相同的。
arr1 和 arr2 的地址是不相同的。

为什么呢???

p1 和 p2 要赋值abcdefg,这的 abcdefg 是存储在【常量区】中的,所以这的 'a' 的地址都是相同的,所以p1 和 p2 中的地址都是这里 'a'的地址所以是相同的。

arr1 和 arr2 是分别开辟了两块内存空间,而在这两个内存空间中分别存入了两个字符串,所以地址肯定是不一样的。

在我知道答案之前,我还以为p1 和 p2也是分别开辟了两个内存空间, 然后分别将两个在不同空间存储的'a'的地址存储在p1 和 p2当中,实则不是这样子的。
其实他俩存储的地址是一样,是我理解错了哈哈哈

标签:printf,字符,打印,地址,简答,abcdefg,字符串,指针
From: https://blog.csdn.net/m0_60605989/article/details/140646291

相关文章

  • C++学习之路——第二天(指针和引用)
    指针和二维数组概述:不管是几维数组,当你使用数组名a而没有取地址操作符&时,它(a)都会退化为指向其第一层的指针。(一维数组指向首元素的指针,二维数组是第一行数组的指针,三维数组是指向其第一层(也就是第一个二维数组)的指针)1、错误示范inta[3][4]={{1,2,3,4},{5,6,7,8},{9......
  • 简单理解【指针数组】与【数组指针】
    2024-07-22笔记-42024-07-23补充笔记【指针数组】顾名思义,就是用来存储地址的数组,所有的元素全中存储的全部都是地址,每一个元素都可以理解为是一个指针变量。char*arr[10];int*arr2[10];char**arr3[5];①举例,多种访问方式intarr[5]={1,2,3,4,5},ar......
  • 字符串数组
    一、二分查找法将一个有序的数列取中值,判断数在哪一段,每次筛选原来的一半,重复多次二、字符串数组(容器,用来存放字符)1.初始化内容:chars[100]=“hello”(字符串常量)字符串结束标志:\0(空字符)单一性、连续性、有序性2.输出字符串puts(s)=puts(&s[0])3.输入字符串scanf......
  • 数组和指针的关系,const修饰指针
     数组和指针的关系 const修饰指针总结:const修饰谁谁就不能变      const修饰*( const在* 前)          不能改变*p的值,可以改变p的指向     const修饰p(const在*后)          不能改变p的指向,可以改......
  • 条件编译,指针
    条件编译 指针指针的常见用法   int a = 100;    int b = 200;    int *p = NULL;    int *q = NULL;    p = &a;    q = &b;假设a的地址为0x00000001,b的地址为0x00000005,p指向a,q指向b含义abpq*p*qp = &b让p......
  • 04-【编写loader工程内容】利用内联汇编显示字符串
    在开发操作系统过程中,有时必须使用某些特殊的指令(如inb/outb/hlt),而C编译器无法自动使用这些指令。因此,如果要使用这些指令,有两种方式:1.在汇编文件中为该指令的使用创建汇编函数(子程序),然后在C代码中以函数调用的方式去使用;2.使用内联汇编:即在C代码中嵌入汇编程序。......
  • Python中如何实现字符串的查询和替换?
    在Python中,字符串的查询和替换是编程中常见的任务,它们可以通过Python的内置方法和库来高效实现。这些操作对于文本处理、数据清洗、日志分析等场景尤为重要。下面,我将详细阐述如何在Python中实现字符串的查询和替换,包括基础方法、高级技巧以及在实际应用中的注意事项。字符......
  • Python字符串:提取重复和随机合并的子字符串
    重复和合并字符串的示例:16.01068.0%08p%.a.p.a.要提取的所需子字符串:16.008%p.a.完整示例:CCoonnttiinnggeennttCCoouuppoonn16.01068.0%08p%.a.p(.Ma.o(nMtholyn)thly)所需子字符串:ContingentCoupon16.008%p.a.(Monthly)我的问题是当原始......
  • Python从0到100(四十五):从字符串到前后端分离
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......
  • C++11 智能指针之shared_ptr
    1.背景基于Alexa的全链路智能语音SDK基于C++实现了跨平台特性,跑通了Android、Mac、Linux等设备,在兼容iOS时发现iOS未提供音频采集和播放的C++接口,所以需要改造SDK,允许SDK初始化时注入外部的采集器和播放器实现类,同时SDK中的Android播放器是基于ffmpeg解码+opensl实现,但......