我想通过指针来理解一些东西,所以我写了这段代码:
#include <stdio.h>
int main(void)
{
char s[] = "asd";
char **p = &s;
printf("The value of s is: %p\n", s);
printf("The direction of s is: %p\n", &s);
printf("The value of p is: %p\n", p);
printf("Th
我正在阅读本教程:,但我不明白这部分是如何工作的。从char**转换到包含unsigned long的struct in_addr **似乎很奇怪。
// Cast the h_addr_list to in_addr
// since h_addr_list also has the ip address in long format only
addr_list = (struct in_addr **) he->h_addr_list;
我希望有人能解释一下发生了什么以及代码是如何工作的。
编辑:更具体:我想知道编译器如何理解我们在这里试图做什么?为什么这个代码应该是正确的?
在c++中,数组标识符是指针,而在java中,数组的标识符是引用变量(实际上是指针)。
假设有一个数组a和b。在java中怎么会允许这个操作:
a = b; //the reference that 'b' holds will be copied to 'a' so both a and b point to the same array
但在C++中,相同的操作将被视为无效的赋值。
如果a和b都是c++中的指针,为什么b保存的地址不会被复制到a
这个问题听起来可能有点奇怪,但我从来没有完全理解为什么我们需要有两种不同的语法来删除C++中的动态分配内存?
例如,
int *p = new int[10];
delete[] p; // why not just delete p;?
在普通的老C中,您只需使用free函数来释放分配给指针的内存,而不管分配的元素数量如何。当然,C++要复杂一些,因为它允许类类型调用它们的析构函数等等。但是,我认为使用单一语法删除C++中动态分配的内存没有任何障碍。
有什么根本原因决定使用两个版本,delete和delete[]?
更重要的是,如果您使用delete而不是delete[],大多数编译器甚至都
我听说,当使用数组作为函数参数时,编译器实际上并不认为它是数组,而是作为指向数组的第一个元素的指针。因此,当询问A(int数组)的大小时,它应该返回指针4的大小(以字节为单位)。但我得到了8。有什么问题吗?
我正在使用CodeBlocks。
int SumOfElemets(int* A, int size){// int* A or int A[] ... it is the same!
int i, sum = 0;
printf("SOE - Size of A = %d, size of A[0] = %d\n", sizeof(A
我正在为一种"c-like"语言编写编译器。目前,编译器支持局部作用域中的数组。可以使用括号表示法-a[0], a[1],...来访问数组的每个元素。为了支持这种数据结构,使用符号表来跟踪当前作用域中的符号以及下一个可用内存空间的地址。为了进行演示,请考虑以下代码:
int a[5]; int b;
使用堆栈实现,并给出一个4字节对齐的内存:为了访问,例如元素a[1],我计算内存位置为
element = ((index+1) * 4) + a.Address; // a.Address is the address of a, which is stored in the s
上下文:
在发现a[i]只是*(a + i)的语法糖,因此相当于*(i + a)和i[a]之前,我用for和off编程了大约2年。我的现实被颠倒了很多“啊哈!”在接下来的几天学习和阅读中,狂欢时刻接踵而至(“这就是为什么数组总是通过引用传递的原因!”)等)。从那时起,我就把指针/数组的等价性内化了,并把它紧紧地放在我的心脏上,所以想象一下,当我偶然发现一种叫做“阵列衰减”的东西时,是多么的震惊啊。以下是典型的例子:
代码:
#include <stdio.h>
int Length(int*);
int main () {
int arr[100];
printf(