首页 > 其他分享 >C语言中多维数组和多重指针的区别

C语言中多维数组和多重指针的区别

时间:2024-05-18 18:32:07浏览次数:14  
标签:s2 C语言 char str 多维 指针

比如下面这段代码:

char str[3][3] = {"aa","bb","cc"};
char** p = str;
char* s1 = str[0];
char* s2 = p[0];

有什么问题?
我们来看实际的内存布局,str是一个多维数组,它的尺寸实际上是3*3=9个char。
也就是一共8bit * 9 = 72bit,而在一台64位机器上,一个char*的大小就是64位,
所以对于char* s1 = str[0]s1的实际大小(使用printf("%p")打印可以得到)是跟str本身一样的,而对于char* s2 = p[0]s2的实际大小会是0x6363006262006161,即把"aa\0bb\0cc"取了出来当作指针。
这个问题关键的地方在于:这种多维数组和多重指针的不同之处是直接由C语言标准支持、编译器加以实现的,而这种不同之处与C语言平时给人的裸露感有一定的相悖,这种相悖给人一种别扭的感觉。

标签:s2,C语言,char,str,多维,指针
From: https://www.cnblogs.com/flametornado/p/18199603

相关文章

  • 结构体中的指针&&拷贝赋值构造函数改造
    带有成员指针的结构体的拷贝1.问题使用结构体时,在析构时发生了**重复释放指针**的错误。2.原因定义了QList<结构体>,使用append添加结构体对象并未此结构体中的指针分配了空间,append会执行值拷贝,此时会创建新的副本添加进QList中,值得注意的是:append执行拷贝时并不会分配地......
  • C语言 while (putchar(getchar()) != '!') 解释
    ​ 代码运行到第4行,getchar()需要输入的数据,但是输入的缓冲区没有数据,所以就需要再命令行窗口(黑窗口)输入新的数据​ 这时候getchar()只需要输入1个字符的数据,但是你可以输入多个数据,打回车的时候之前输入的一行数据都会被发送到缓冲区,回车之前都还可以删除刚才输入的数据修改修......
  • 指针压缩
    1查看$java-XX:+PrintCommandLineFlags-version -XX:-UseCompressedClassPointers-XX:-UseCompressedOops-XX:+UseCompressedClassPointers-XX:+UseCompressedOops 2 JDK1.8之后默认开启这两个压缩当堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址......
  • C语言第六篇-结构体
    一、结构体的概念1.结构体是什么?在实际的应用中,往往变量的类型复杂多变,我们仅仅使用C语言内置的类型无法准确的去定义变量,所以引出了结构体这个概念。也就是说,为了描述复杂类型的个体,只用C语言基础的内置类型不能完整的表述,而结构体就可以很好的解决这个问题。结构体本质上还是......
  • C语言第五篇-指针
    什么是指针指针是内存中一个最小单元的编号,也就是地址平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量指针变量我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量#include<stdio.h>intmain(){prin......
  • 实验4 C语言数组应用编程
    实验任务1task1_11#include<stdio.h>2#defineN434voidtest1(){5inta[N]={1,9,8,4};6inti;78//输出数组a占用的内存字节数9printf("sizeof(a)=%d\n",sizeof(a));1011//输出int类型数组a中每个元......
  • C语言输出函数介绍
    一,printf()函数  printf()是标准输出函数。printf()函数打印数据指令的指令要与待打印数据的类型匹配。如打印整数时用%d,打印字符时用%c。如果与之不匹配打印的结果会于想要的结果不符。打印使用的如%f,%d,%c被称为转换说明。下列是ANSIC标准常见的转换说明。    转......
  • c语言程序实验————实验报告八
    c语言程序实验————实验报告八实验项目名称:实验报告8字符串处理函数实验项目类型:验证性实验日期:2024年5月9日一、实验目的1.熟练掌握数组的定义格式和数组元素的表示方法;2.熟悉数组的初始化方法和赋值方法;3.掌握字符数组存放字符串的方法和字符串函数的使用;4.......
  • 加练日记2-二分,双指针,排序
    二分模板 #include<bits/stdc++.h>usingnamespacestd;usingll=longlong;constllMOD=998244353;lln,m;constllN=2e5+9;lla[N];llv[N];intf(llmid){ llans=0,pre=-1e9; for(inti=1;i<=n;i++){ if(a[i]-pre>=mid)ans++,pre=a[i......
  • C语言第四篇-操作符
    算术操作符#include<stdio.h>intmain(){inta=8;intb=4;intc=0;intd=0;c=a/b;//8/4=2;8/2.0=4.0;d=a%b;//8.0%2是错误的,%两端必须为整数;return0;}移位操作符<<左移操作符:将一个数的二进制位全部左移若干位。‘>>右移操作......