Questions tagged «pointers»

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

3
递增指向0大小的动态数组的指针是否未定义?
AFAIK,尽管我们无法创建大小为0的静态内存数组,但是我们可以使用动态数组来做到这一点: int a[0]{}; // Compile-time error int* p = new int[0]; // Is well-defined 如我所读,p行为就像一个过去的元素。我可以打印p指向的地址。 if(p) cout << p << endl; 尽管我确定我们不能像使用迭代器(过去元素)那样取消引用该指针(过去元素),但是我不确定是否要增加该指针p?是否像迭代器一样具有未定义的行为(UB)? p++; // UB?

7
指针比较在C中如何工作?比较不指向同一数组的指针是否可以?
在K&R(C编程语言第二版)第5章中,我阅读了以下内容: 首先,可以在某些情况下比较指针。如果p和q指向同一个数组的成员,则关系一样==,!=,<,>=,等正常工作。 这似乎暗示着只能比较指向同一数组的指针。 但是当我尝试这段代码时 char t = 't'; char *pt = &t; char x = 'x'; char *px = &x; printf("%d\n", pt > px); 1 被打印到屏幕上。 首先,我以为我会得到未定义或某种类型或错误的信息,因为pt和px没有指向同一数组(至少在我看来)。 同样是pt > px因为两个指针都指向存储在堆栈中的变量,并且堆栈变小,所以的内存地址t大于x?的内存地址。这是为什么pt > px呢? 引入malloc时,我会更加困惑。同样,在K&R的8.7章中,内容如下: 但是,仍然有一个假设,即sbrk可以有意义地比较指向返回的不同块的指针。该标准不能保证这一点,该标准仅允许在数组内进行指针比较。因此,此版本malloc仅可在通用指针比较有意义的机器之间移植。 将指向堆上分配的空间的指针与指向堆栈变量的指针进行比较,我没有任何问题。 例如,以下代码可以很好地工作并1可以打印: char t = 't'; char *pt = &t; char *px = malloc(10); strcpy(px, pt); …


3
C是否与C ++具有等效的std :: less?
我最近在回答一个关于p < q当p和q是指向不同对象/数组的指针时在C 中执行的未定义行为的问题。这让我想到:C ++ <在这种情况下具有相同(未定义)的行为,但是还提供了标准库模板std::less,该模板保证可以返回与<可以比较指针时相同的东西,并在不能比较时返回一些一致的顺序。 C是否提供具有类似功能的东西,从而可以安全地比较任意指针(相同类型)?我尝试浏览C11标准并没有发现任何东西,但是我在C中的经验比在C ++中小得多,因此我很容易错过一些东西。

1
C语言中重叠对象的语义是什么?
考虑以下结构: struct s { int a, b; }; 通常为1,此结构的大小为8,对齐方式为4。 如果我们创建两个struct s对象(更准确地说,我们将两个这样的对象写入分配的存储区),而第二个对象与第一个对象重叠怎么办? char *storage = malloc(3 * sizeof(struct s)); struct s *o1 = (struct s *)storage; // offset 0 struct s *o2 = (struct s *)(storage + alignof(struct s)); // offset 4 // now, o2 points half way into o1 *o1 …

1
__func__指针的两个constexpr实例的区别是否仍然是constexpr?
这是有效的C ++吗? int main() { constexpr auto sz = __func__ - __func__; return sz; } GCC和MSVC认为可以,而Clang认为不可以:Compiler Explorer。 所有编译器都同意这是可以的:Compiler Explorer。 int main() { constexpr auto p = __func__; constexpr auto p2 = p; constexpr auto sz = p2 - p; return sz; } Clang再次不喜欢这个,但是其他的都可以:Compiler Explorer int main() { constexpr auto p …

1
指向不完整类型的指针可以不完整吗?
可以int (*)[]是不完整的类型吗? C 2018 6.2.5 1说: 在翻译单元内的各个点上,对象类型可能不完整(缺少足够的信息来确定该类型对象的大小)或完整(具有足够的信息)。 因此,似乎如果类型的大小已知,则该类型是完整的。6.2.6.1 28指定某些类型的指针必须具有相同的大小(指向void和的字符,指向兼容类型的指针,指向结构的指针以及指向联合的指针),但是指向其他类型的指针可能会有所不同。 在C实现中,所有指针或指向数组的所有指针 int都具有相同的大小,则int (*)[]已知的大小,因此将是完整的。例如,在对大型数组使用不同指针的实现中,大小是未知的,因此不完整。 作为MM指出,一个结构必须不包含不完全型的成员,在6.7.2.1 3.这表明与指针中的一个尺寸的实现必须接受除最终柔性阵列构件,每一个约束struct { int (*p)[]; }而一实现具有不同此类数组的大小必须诊断出约束违例。(这反过来意味着这样的声明不是严格符合C的一部分。)

4
sizeof如何与对数组的指针取消引用一起工作?
在这里,我有一个指向4个整数的ptr数组arr的指针。ptr指向整个数组。ptr[0]或*ptr指向数组的第一个元素,因此加1即可ptr[0]得出数组第二个元素的地址。 我不明白为什么使用sizeof(ptr[0])给出整个数组的大小16个字节,而不是第一个元素的大小4个字节(ptr[0]指向数组中第一个元素)。 int arr[4] = {0, 1, 2, 3}; int (*ptr)[4] = &arr; printf("%zd", sizeof(ptr[0])); //output is 16
9 c  arrays  pointers 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.