哪些字符应该用于ptrdiff_t在printf?
请问C标准明确说明如何打印ptrdiff_t的printf?我还没找到任何人.
int a = 1;
int b = 2;
int* pa = &a;
int* pb = &b;
ptrdiff_t diff = b - a;
printf("diff = %?", diff); // % what?
Run Code Online (Sandbox Code Playgroud) 这个网站上的第一个计时器,所以这里..
我是C++的新手,我目前正在阅读"DS Malik的数据结构使用C++第二版"一书.
在书中,Malik提供了两种创建动态二维数组的方法.在第一种方法中,将变量声明为指针数组,其中每个指针都是整数类型.恩.
int *board[4];
Run Code Online (Sandbox Code Playgroud)
..然后使用for循环创建'列',同时使用指针数组作为'行'.
第二种方法,您使用指针指针.
int **board;
board = new int* [10];
Run Code Online (Sandbox Code Playgroud)
等等
我的问题是:哪种方法更好?**方法对我来说更容易可视化,但第一种方法可以大致相同的方式使用.两种方式都可用于制作动态二维数组.
编辑:上面的帖子不够清楚.这是我尝试过的一些代码:
int row, col;
cout << "Enter row size:";
cin >> row;
cout << "\ncol:";
cin >> col;
int *p_board[row];
for (int i=0; i < row; i++)
p_board[i] = new int[col];
for (int i=0; i < row; i++)
{
for (int j=0; j < col; j++)
{
p_board[i][j] = j;
cout << p_board[i][j] << " ";
}
cout << endl;
}
cout << …Run Code Online (Sandbox Code Playgroud) 来自Rust指南:
要取消引用(获取引用的值而不是引用本身)
y,我们使用星号(*)
所以我做到了:
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, *ptr_y);
}
Run Code Online (Sandbox Code Playgroud)
即使没有明确的解引用,这也给了我相同的结果(x = 1; y = 1):
fn main() {
let x = 1;
let ptr_y = &x;
println!("x: {}, ptr_y: {}", x, ptr_y);
}
Run Code Online (Sandbox Code Playgroud)
为什么?不应该ptr_y打印内存地址并*ptr_y打印1?是否有某种自动解除引用或者我错过了什么?
为什么以下代码会发出警告?
int main(void)
{
struct {int x; int y;} test = {42, 1337};
struct {int x; int y;} *test_ptr = &test;
}
Run Code Online (Sandbox Code Playgroud)
结果:
warning: initialization from incompatible pointer type [-Wincompatible-pointer-types]
struct {int x; int y;} *test_ptr = &test;
^
Run Code Online (Sandbox Code Playgroud) 我有以下问题:
在C++程序中,我有一个声明为的全局数据结构Renderer Rendering_Handler,其中包含一个定义为的成员字段vector<Render_Info> visble objects.
数据结构本身正在做什么并不重要,它们是抽象数据以并行化我的程序所需的包装器.
要清楚,Rendering_Handler是完全全局的,它实际上是一个单例(我可以100%确认构造函数已被调用一次,对于此类只调用一次).
我已经声明了以下类方法:
Render_Info* Renderer::add_Render_Info()
{
visible_objects.push_back(Render_Info());
return &(visible_objects.back());
}
Run Code Online (Sandbox Code Playgroud)
很简单,它创建一个新Render_Info结构,将它附加到visible_objects数组并返回指向该对象的指针.
调用的另一个数据结构Chunk具有定义为的构造函数
Chunk::Chunk(vec3 offset, World* w)
{
/*initialize some values*/
draw_info = Rendering_Handler->add_Render_Info();
draw_info->VBOs = vector<GLuint>(5);
/*initialize OpenGL VAOs, VBOs and other buffer objects*/
cout << draw_info->VBOs.size() << endl;
cout << draw_info << endl;
}
Run Code Online (Sandbox Code Playgroud)
它还有一个定义为的方法:
void Chunk::update_render_info()
{
cout << draw_info->VBOs.size() << endl;
cout << draw_info << endl;
/*OpenGL stuff*/
}
Run Code Online (Sandbox Code Playgroud)
最后
我们有初始化所有内容的方法:
World::World() …Run Code Online (Sandbox Code Playgroud) 我对的含义感到困惑void *function()。
它是指向函数的指针还是返回的函数void*?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。
C 标准规定:
指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求。所有指向联合类型的指针都应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。
即sizeof(int*)不一定等于sizeof(char*)- 但sizeof(struct A*)一定等于sizeof(struct B*)。
这个要求背后的原理是什么?据我了解,基本类型不同大小背后的基本原理 是支持近/远/巨大指针等用例(编辑:正如评论和接受的答案中指出的那样,这不是基本原理) - 但不是这个相同的原理适用struct于内存中不同位置的 s 吗?
在编写一个简单的函数来从字符串中删除特定字符时,我遇到了这个奇怪的问题:
void str_remove_chars( char *str, char to_remove)
{
if(str && to_remove)
{
char *ptr = str;
char *cur = str;
while(*ptr != '\0')
{
if(*ptr != to_remove)
{
if(ptr != cur)
{
cur[0] = ptr[0];
}
cur++;
}
ptr++;
}
cur[0] = '\0';
}
}
int main()
{
setbuf(stdout, NULL);
{
char test[] = "string test"; // stack allocation?
printf("Test: %s\n", test);
str_remove_chars(test, ' '); // works
printf("After: %s\n",test);
}
{
char *test = "string test"; // non-writable?
printf("Test: %s\n", …Run Code Online (Sandbox Code Playgroud) 以下示例是C中有效的完整翻译单元吗?
struct foo;
struct foo *bar(struct foo *j)
{
return &*j;
}
Run Code Online (Sandbox Code Playgroud)
struct foo是一个不完整的类型,但我找不到明确禁止在C标准中解除引用不完整类型.特别是,§6.5.3.2说:
一元运算
&符产生其操作数的地址.如果操作数具有类型''type'',则结果具有类型''指向类型''的指针.如果操作数是一元运算*符的结果,则不会对该运算符和&运算符进行求值,结果就好像两者都被省略,除了对运算符的约束仍然适用且结果不是左值.
结果不是左值的事实不是密切相关的 - 返回值不一定是.对*运营商的限制很简单:
一元*运算符的操作数应具有指针类型.
而对于&运营商来说:
一元运算
&符的操作数应该是函数指示符,[]一元或一元运算*符的结果,或者是一个左值,它指定一个不是位字段且不用register存储类说明符声明的对象.
这两个都非常满意,所以结果应该等同于return j;.
但是,gcc 4.4.5不编译此代码.它反而出现以下错误:
y.c:5: error: dereferencing pointer to incomplete type
Run Code Online (Sandbox Code Playgroud)
这是gcc的缺陷吗?
错误如下:
请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.
我的代码:
#include <iostream>
using namespace std;
int main()
{
int * mypointer;
int arr[5] = {1,3,5,7,9};
mypointer = arr;
for(auto it = arr.begin(); it != arr.end(); ++it) {
cout<<*mypointer<<endl;
mypointer++;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)