pointers 相关问题

“指向”存储在内存中的另一个值的数据类型。指针变量包含某个其他实体(变量或函数或其他实体)的内存地址。此标记应用于涉及指针使用的问题,而不是引用。使用指针的最常见编程语言是C,C ++,Go和汇编语言。使用特定语言标记。其他有用的标签是描述指针使用的方法,函数,结构等。

实现“split”功能时c代码输出不一致

我正在尝试用 C 语言实现 python 的“split()”函数,代码如下: #包括 #包括 int strsplit(char *, 无符号长*); 无效strprint(

回答 1 投票 0

在 C 中交换字符串和数组的通用交换函数

我正在通过尝试实现一个能够交换字符串和数组的通用交换函数来学习C。我认为这是可能的,因为字符串和数组本质上都是内存中的数组,...

回答 2 投票 0

指向 const 成员函数 typedef 的指针

我知道可以像这样分开创建一个指向成员函数的指针 结构体 K { void func() {} }; typedef 无效 FuncType(); typedef FuncType K::* MemFuncType; MemFuncType pF = &K::...

回答 3 投票 0

函数指针和参数

我一直在尝试理解 geeksforgeeks 的帖子,但无法理解代码片段。这是以下帖子: https://www.geeksforgeeks.org/returning-a-function-pointer-from-a-

回答 1 投票 0

二维数组如何存储在内存中?

#包括 使用命名空间 std; int main() { 整数a[101][101]; a[2][0]=10; 计算< #include<bits/stdc++.h> using namespace std; int main() { int a[101][101]; a[2][0]=10; cout<<a+2<<endl; cout<<*(a+2)<<endl; cout<<*(*(a+2)); return 0; } 为什么a+2和*(a+2)的值相同? 提前致谢! a是一个二维数组,即数组的数组。但当在适当的上下文中使用时,它会“衰减”为指向数组的指针。所以: 在 a+2 中,a 衰减为指向大小为 101 的 int 数组的指针。当您将 is 传递给 ostream 时,您将获得该数组的第一个元素的地址,即 &(a[2][0])*(a+2)中的根据定义是a[2]:它是一个从a[2][0]开始、大小为101的数组。它衰减为一个指向 int 的指针,当你将它传递给 ostream 时,你会得到它的第一个元素的地址,它仍然是 &(a[2][0])**(a+2) 是 根据定义 a[2][0]。当你将它传递给 ostream 时,你会得到它的 int 值,这里是 10。 但要注意:a + 2和a[2]都是指向同一地址的指针(static_cast<void *>(a+2)与static_cast<void *>(a[2])相同),但它们是指向不同类型的指针:第一个指向大小为101的int数组,后者指向int. 我将尝试向您解释编译器如何映射内存: 让我们考虑一个更实用的多维数组示例: int a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; 可以执行命令 x/10w a 在GDB中查看内存: 0x7fffffffe750: 1 2 3 4 0x7fffffffe760: 5 6 7 8 0x7fffffffe770: 9 0 每个元素都存储为 int 类型(32 位/4 字节)。 所以矩阵的第一个元素已存储在: 1) a[0][0] -> 0x7fffffffe750 2) a[0][1] -> 0x7fffffffe754 3) a[0][2] -> 0x7fffffffe758 4) a[1][0] -> 0x7fffffffe75c 5) a[1][1] -> 0x7fffffffe760 6) a[1][2] -> 0x7fffffffe764 7) a[2][0] -> 0x7fffffffe768 ... 命令: std::cout << a + 2 << '\n' 它将打印地址 0x7fffffffe768 因为 指针算术: a 的类型是 int** 所以它是一个指向指针的指针。 a+2 是 a[0](第一行)+ 2。结果是一个指针 到第三排。 *(a+2) 遵循第三行,即 {7,8,9} 第三行是一个int数组,它是一个指向int的指针。 然后是操作员 << will print the value of that pointer. 二维数组是数组的数组,因此它在内存中的存储方式如下: char v[2][3] = {{1,3,5},{5,10,2}}; Content: | 1 | 3 | 5 | 5 | 10 | 2 Address: v v+1 v+2 v+3 v+4 v+5 要访问 v[x][y],编译器将其重写为: *(v + y * M + x)(其中 M 是指定的第二个维度) 例如,要访问 v[1][1],编译器将其重写为 *(v + 1*3 + 1) => *(v + 4) 请注意,这与指向指针 (char**) 的指针不同。 指向指针的指针不是数组:它包含指向内存单元的地址,该内存单元包含另一个地址。 要使用指向指针的指针访问二维数组的成员,请执行以下操作: char **p; /* Initialize it */ char c = p[3][5]; 前往p内容指定的地址; 将偏移量添加到该地址(在我们的例子中为 3);转到该地址并获取其内容(我们的新地址)。 将第二个偏移量添加到新地址(在我们的例子中为 5)。 获取该地址的内容。 通过传统的二维数组访问成员时,步骤如下: char p[10][10]; char c = p[3][5]; 获取 p 的地址,并将第一个偏移量 (3) 乘以行的尺寸 (10)。 将第二个偏移量 (5) 添加到结果中。获取该地址的内容。 如果你有一个这样的数组 T a[N]; 然后数组的名称会隐式转换为指向其第一个元素的指针,但极少数例外(例如在 sizeof 运算符中使用数组名称)。 因此,例如在表达式 ( a + 2 ) a 中,转换类型 T * 的值为 &a[0]。 相对于您的数组示例 int a[101][101]; 表达中 a + 2 a 转换为 int ( * )[101] 类型的右值并指向数组的第一“行”。 a + 2 指向数组的第三“行”。行的类型是 int[101] 表达式 *(a+2) 给出了类型为 int[101] 的第三行,它是一个数组。这个数组在表达式中使用时会依次转换为指向其第一个类型为 int * 的元素的指针。 与第三行占用的内存区域起始地址相同 只有表达式 ( a + 2 ) 具有类型 int ( * )[101],而表达式 *( a + 2 ) 具有类型 int *。但两者产生相同的值 - 数组第三行占用的内存区域的起始地址a。 数组的第一个元素与数组本身位于同一位置 - 数组中没有“空白空间”。 在 cout << a + 2 中,a 被隐式转换为指向其第一个元素 &a[0] 的指针,而 a + 2 是 a 的第三个元素 &a[2] 的位置。 在 cout << *(a + 2) 中,数组 *(a + 2) - 即 a[2] - 被转换为指向其第一个元素 &a[2][0] 的指针。 由于 a 的第三个元素的位置和 a 的第三个元素的第一个元素的位置相同,因此输出相同。

回答 5 投票 0

C 头文件问题:未定义的引用错误

我目前正在从事一个 C 编程项目,遇到了一个我正在努力解决的问题。 问题: 我使用 Visual Studio Code (VS Code) 作为我的代码编辑器。项目

回答 1 投票 0

在构造函数中使用不安全和指针时,这种奇怪的行为是什么?

我遇到了一个奇怪的问题,程序的成功或失败取决于是否将我的不安全块放入构造函数中。不确定这是一个错误还是我只是在后者中很幸运......

回答 1 投票 0

如何解决将 'char (*)[64]' 传递给 'const char **' 类型的参数时指针类型不兼容的问题

当我在排序函数中传递 name[100][64] 时,我不断收到不兼容的指针类型,将“char (*)[64]”传递给“const char **”类型的参数,并最终出现分段错误11 #德...

回答 1 投票 0

指向数组指针的指针 (char** arrptr = &arr)

我尝试初始化一个指向 char (char**) 的指针: 字符数组[8]; char ** arrptr = &arr; 我收到警告: “从不兼容的指针类型初始化&q...

回答 3 投票 0

将连续数组传递给函数时,传递指针和大小,还是传递开始指针和结束指针更合适?

当设计一个需要指针形式的连续数组的函数时,是否应该使用以下方式传递数组 A。 指针和数组的大小: void foo(int* arr, size_t 大小); 或者B。 一个开始-

回答 1 投票 0

使用指针比较 C 中的字符串

我正在学习 C 课程,我很难弄清楚以下练习。 给定 2 个 char 指针,该函数应该按字典顺序比较指针指向的字符串...

回答 1 投票 0

C++:将 2D 数组转换为 2D 向量

我想将 2D 数组 (faces0) 转换为 2D 向量 (faces1)。我尝试了以下代码。它给出了编译时错误。 bool read_polygon_mesh(Point_3 *points0, int **faces0, 多边形...

回答 1 投票 0

如何比较 Go 中的 2 个函数?

例如,我有要比较的函数列表: http://play.golang.org/p/_rCys6rynf 类型 Action func(foo string) 类型处理程序结构 { 采取行动 行动后 } var 路线图[s...

回答 4 投票 0

传递给函数时结构指针不更新

我有一个头文件和两个源文件。 以下是我的 tpool_pq.h 文件中的代码。 typedef 枚举优先级_t {低 = 1,中 = 3,高 = 5}priority_t; typedef 结构体task_t { 无效(*函数)...

回答 1 投票 0

Box2d 主体,保存 b2BodyDef、b2Shape 和 b2FixtureDef

要创建并初始化 b2Body,我们需要创建 b2BodyDef、b2Shape 和 b2FixtureDef,并将这些值作为函数指针传递。 所以我可以有一个像这样的 createBody 函数: b2...

回答 1 投票 0

将固定大小的数组传递给带有指针参数的函数

我想知道是否有办法让以下代码正常工作,或者我是否必须为固定大小创建该函数的新副本?如果是这样,我怎样才能有一个固定大小的通用函数。 无效

回答 3 投票 0

将指针参数传递给函数?

我见过并编写过传递更新对象引用参数的函数,因为我需要返回代码,或者需要在一个函数中更改多个变量。 现在我看到了一个

回答 1 投票 0

返回unique_ptr的不可变向量

我有以下对象: 类容器{ 民众: std::vector>& items() { 返回 m_items; } 私人的: std::向量>

回答 1 投票 0

strtok:复制的字符指针的地址与源字符指针相同

我遇到了问题,我需要有人来解释发生了什么。 我正在解析像 a=1&b=2&c=3 这样的字符串,我想将其解析为 ["a=1","b=2","c=3"] 然后...

回答 3 投票 0

复制的字符指针的地址与源字符指针相同

我遇到了问题,我需要有人来解释发生了什么。 我正在解析像 a=1&b=2&c=3 这样的字符串,我想将其解析为 ["a=1","b=2","c=3"] 然后...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.