标签: pointers

printf格式(%d与%u)

打印指针地址%d%u打印时有什么区别?

例如:

int a = 5;
// check the memory address
printf("memory address = %d\n", &a); // prints "memory address = -12"
printf("memory address = %u\n", &a); // prints "memory address = 65456"
Run Code Online (Sandbox Code Playgroud)

c formatting printf pointers

15
推荐指数
3
解决办法
10万
查看次数

为什么operator->手动重载?

如果p->m仅仅是语法糖是不是有意义(*p).m?基本上,operator->我写过的每一个都可以实现如下:

Foo::Foo* operator->()
{
    return &**this;
}
Run Code Online (Sandbox Code Playgroud)

在任何情况下,我想要p->m的意思是什么(*p).m

c++ pointers smart-pointers operator-overloading

15
推荐指数
1
解决办法
465
查看次数

使用C中的函数更改数组?

我想调用一个函数,我希望该函数将程序中字符串或数组的内容更改为常量.

伪代码:

some_array = "hello"
print some_array   #prints "hello"
changeArray(some_array)
print some_array  #prints "bingo"
Run Code Online (Sandbox Code Playgroud)

我知道我必须将指针传递给该函数.这是我写的,

void changeArray(char *arr){
    arr = "bingo";
}

int main(int argc, const char* argv[]){
    char *blah = "hello";
    printf("Array is %s\n",blah);
    changeArray(blah);
    printf("Array is %s\n",blah);
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

c arrays pointers function

15
推荐指数
2
解决办法
6万
查看次数

malloc一个struct指针数组

我有以下结构:

typedef struct _chess {
   int **array;
   int size;
   struct _chess *parent;
} chess;
Run Code Online (Sandbox Code Playgroud)

我有:

typedef struct _chess *Chess;
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个动态长度数组来存储指向ARCH结构的指针,所以我执行以下操作:

Chess array [] = malloc(size * sizeof(Chess));
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:初始化程序无效.

如果我放弃[]并执行此操作:

Chess array = malloc(size * sizeof(Chess));
Run Code Online (Sandbox Code Playgroud)

它编译没有错误,但当我尝试通过执行以下操作将此数组的元素设置为NULL:

array[i]=NULL;
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:从类型'void*'分配类型'struct _chess'时出现不兼容的类型

知道我做错了什么吗?谢谢.

c arrays malloc struct pointers

15
推荐指数
2
解决办法
11万
查看次数

将const关键字添加到作为参数传递给函数的数组中

有没有什么办法可以将const关键字添加到作为参数传递的数组中来运行:

void foo(char arr_arg[])
Run Code Online (Sandbox Code Playgroud)

如果我放在()const之前或之后(),那将意味着它不是常数,而不是.charvoid foo(const char arr_arg[])charvoid foo(char const arr_arg[])chararr_arg

我刚刚读到,在引擎盖下,作为参数发送的数组被表示为指针,因此void foo(char arr_arg[])也是如此void foo(char* ptr_arg).考虑到这一点,我可能会重写函数,void foo(char * const ptr_arg)因为它正是我想要实现的.

但是我想知道是否有一种方法可以const在此声明中添加关键字,void foo(char arr_arg[])使其与void foo(char * const ptr_arg)(而不是 void foo(char const * ptr_arg)void foo(const char * ptr_arg))相同?

我只是想了解是否存在arr_arg使用数组表示法使常量变为常量的语法[].

c pointers

15
推荐指数
2
解决办法
7233
查看次数

shared_ptr和weak_ptr转换

我正在尝试使用std::shared_ptr和处理对象std::weak_ptr.场景是这样的:

我有一个类的对象,channel它派生自一个抽象类abstract::channel(使用纯虚函数).我有一个容器channelContainer(std::vector)包含对象的共享指针(std::shared_ptr)channel.

现在,我有一个deque (std::deque)包含弱指针(std::weak_ptr)的每个对象channelContainer.让我们说出这个双端队列freeChannelQueue.

所以我们说:

std::vector<std::shared_ptr<abstract::channel> > channelContainer;
std::deque<std::weak_ptr<abstract::channel > > freeChannelQueue;

//Assuming that both the containers are filled appropriately How do I go about implementeing the below functions?

abstract::channel& get_free_channel() {
  //This should return a free channel object from 'freeChannelQueue' and pop the queue.
}

bool release_channel(abstract::channel& ch) {
 //This should convert 'ch' to a …
Run Code Online (Sandbox Code Playgroud)

c++ pointers shared

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

什么是未对齐的指针?

据我所知,在以下行中,我们尝试写入无效的内存位置.但这实际上也是一个未对齐的指针.有人可以解释什么是未对齐的指针,以及下面的未对齐指针是什么?

*(int*)0xffffffff = 0xbad;
Run Code Online (Sandbox Code Playgroud)

c pointers alignment

15
推荐指数
1
解决办法
3435
查看次数

删除指针数组

确实delete[] a,在那里a被指针的动态分配的数组,执行delete对于在阵列中的每个指针?

我想,它为具有用户定义类的数组执行析构函数,但是指针发生了什么?

c++ arrays pointers delete-operator

15
推荐指数
2
解决办法
1万
查看次数

如何安全合理地确定指针是否指向某个指定缓冲区?

我正在寻找一个函数来确定给定的指针是否指向给定的缓冲区.规格:


template <typename T>
bool points_into_buffer (T *p, T *buf, std::size_t len);
Run Code Online (Sandbox Code Playgroud)

如果有一些n,0 <= n && n < len为这p == buf + n,退货true.

否则,如果有一些n,0 <= n && n < len * sizeof(T)为它reinterpret_cast<char *>(p) == reinterpret_cast<char *>(buf) + n的行为是不确定的.

否则,返回false.


明显的实现看起来像

template <typename T>
bool points_into_buffer (T *p, T *buf, std::size_t len) {
    return p >= buf && p < buf + len;
}
Run Code Online (Sandbox Code Playgroud)

但是在标准C++中有未定义的行为:指针的关系比较仅针对指向同一数组的指针定义. …

c++ pointers undefined-behavior

15
推荐指数
1
解决办法
233
查看次数

为什么char指针变量可以初始化为字符串但int指针变量不能初始化为整数数组?

我试图理解字符串,数组和指针之间的关系.

我正在阅读的这本书有一个程序,它在其中初始化变量如下:

char* szString= "Name";
Run Code Online (Sandbox Code Playgroud)

我理解这一点的方式是,C风格的字符串只是一个字符数组.数组只是引用指针(存储数组的第一个值)和偏移量的简写版本.即 array[5]实际上返回从表达式计算的内容*(array+5).

因此,根据我的理解和测试,szString实际上被初始化为指向存储"Name"的数组的第一个地址的指针.我可以推断出这个因为输出到:

cout << *szstring;
Run Code Online (Sandbox Code Playgroud)

是字符"N".

我对声明的理解

cout << szstring;
Run Code Online (Sandbox Code Playgroud)

输出字符"Name",方法cout将参数szstring解释为字符串类型,并打印出所有字符,直到NUL字符.另一方面,对于参数*szstring,使用支持C样式字符串的此方法的不同版本.

因此,如果我可以初始化一个char类型指针来寻址一个chars数组中的第一个元素(一个C风格的字符串),为什么我不能初始化一个整数数组中第一个元素的int类型指针,如下所示:

int* intArray = {1,2,3};
Run Code Online (Sandbox Code Playgroud)

c++ arrays string pointers

15
推荐指数
2
解决办法
1239
查看次数