标签: pointers

C:printf中的ptrdiff_t应该使用哪个字符?

哪些字符应该用于ptrdiff_tprintf

请问C标准明确说明如何打印ptrdiff_tprintf?我还没找到任何人.

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 printf pointers

26
推荐指数
3
解决办法
5704
查看次数

指针指针动态二维数组

这个网站上的第一个计时器,所以这里..

我是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)

c++ arrays pointers memory-management dynamic-arrays

26
推荐指数
2
解决办法
14万
查看次数

为什么打印指针打印与打印取消引用指针相同?

来自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?是否有某种自动解除引用或者我错过了什么?

pointers dereference rust

26
推荐指数
2
解决办法
6537
查看次数

C - 不兼容的指针类型

为什么以下代码会发出警告?

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 struct pointers initialization incompatibletypeerror

26
推荐指数
2
解决办法
3905
查看次数

在没有显式命令的情况下在函数调用之间清除数组指针数据?

我有以下问题:

在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)

c++ pointers memory-management

26
推荐指数
1
解决办法
574
查看次数

void * function()是指向函数的指针还是返回void *的函数?

我对的含义感到困惑void *function()
它是指向函数的指针还是返回的函数void*?我一直在数据结构上使用它作为返回指针的递归函数,但是当我在多线程(pthread)中看到代码时,会有一个相同的函数声明。现在我很困惑他们之间有什么区别。

c c++ pointers function-pointers declaration

26
推荐指数
2
解决办法
1839
查看次数

为什么所有指向结构的指针都必须具有相同的大小?

C 标准规定:

指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求。类似地,指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求。所有指向结构类型的指针都应具有相同的表示和对齐要求。所有指向联合类型的指针都应具有相同的表示和对齐要求。指向其他类型的指针不需要具有相同的表示或对齐要求。

sizeof(int*)不一定等于sizeof(char*)- 但sizeof(struct A*)一定等于sizeof(struct B*)

这个要求背后的原理是什么?据我了解,基本类型不同大小背后的基本原理 是支持近/远/巨大指针等用例编辑:正如评论和接受的答案中指出的那样,这不是基本原理) - 但不是这个相同的原理适用struct于内存中不同位置的 s 吗?

c pointers language-lawyer

26
推荐指数
1
解决办法
2035
查看次数

char*str ="STRING"和char str [] ="STRING"之间的区别?

在编写一个简单的函数来从字符串中删除特定字符时,我遇到了这个奇怪的问题:

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 arrays string stack pointers

25
推荐指数
2
解决办法
3万
查看次数

是&p有效C,假设p是指向不完整类型的指针?

以下示例是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的缺陷吗?

c pointers language-lawyer incomplete-type

25
推荐指数
1
解决办法
718
查看次数

不能在数组上使用.begin()或.end()

错误如下:

请求'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)

c++ arrays pointers iterator c++11

25
推荐指数
2
解决办法
4万
查看次数