相关疑难解决方法(0)

无法通过这种方式来计算数字的平方

我找到了一个计算数字平方的函数:

int p(int n) {
    int a[n]; //works on C99 and above
    return (&a)[n] - a;
}
Run Code Online (Sandbox Code Playgroud)

它返回n 2的值.问题是,它是如何做到的?经过一点点测试后,我发现之间是(&a)[k]和/ .这是为什么?(&a)[k+1]sizeof(a)sizeof(int)

c arrays pointers c99 variable-length-array

135
推荐指数
4
解决办法
9184
查看次数

数组指针衰减并将多维数组传递给函数

我知道一个数组衰减到指针,如果一个声明

char things[8];
Run Code Online (Sandbox Code Playgroud)

然后在things其他地方使用,things是一个指向数组中第一个元素的指针.

另外,根据我的理解,如果有人宣称

char moreThings[8][8];
Run Code Online (Sandbox Code Playgroud)

那么moreThings不是指向char的类型指针,而是类型为"指向char的指针数组",因为衰减只发生一次.

什么时候moreThings传递给一个函数(比如说原型void doThings(char thingsGoHere[8][8])实际上是什么进行了堆栈?

如果moreThings不是指针类型,那么这仍然是一个传递引用?我想我一直认为它moreThings仍然代表了多维数组的基地址.如果doThings接受输入thingsGoHere并将其传递给另一个函数会怎么样?

规则几乎是除非指定数组输入,const然后数组将始终可修改?

我知道类型检查的东西只发生在编译时,但我仍然对技术上作为一个引用传递的东西感到困惑(即只有当传递类型指针的参数时,或者指针数组是否为传递 - 参考也是?)

很抱歉这个问题在这个地方有点儿,但由于我很难理解这一点,很难说出一个精确的询问.

c arrays callstack pointers multidimensional-array

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

为什么解除引用数组会产生相同的地址?

在C++中,我编写了以下简单的main:

int main() {
    char test[100];
    void* a = (void*) test;
    void* b = (void*) &test;

    std::cout << a << " " << b << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它给了我相同的结果ab.为什么是这样?我希望第二个是第一个地址的符号.

c++ pointers

10
推荐指数
1
解决办法
105
查看次数

*ptr和*(&ptr + 1)之间的差异

我是指针和学习指针基础知识的新手.我想从下面的代码中了解*ptr和*(&ptr + 1)之间的区别.

#include<stdio.h>
int main()
{
     int a[3] = {1, 2, 3};
     int *ptr = a;

     printf("*ptr = %d\n",*ptr);
     printf("&ptr = %p\n",&ptr);

     printf("(&ptr + 1) = %p\n",(&ptr + 1));
     printf("*(&ptr + 1) = %d\n",*(&ptr + 1));

     return 0;
}       
Run Code Online (Sandbox Code Playgroud)

从我的分析中,gcc产生了以下输出,

*ptr = 1    // as ptr = a, Ultimately *ptr will print the first value of array i.e. 1
&ptr = 0x7fffa7e97788   // Starting Address of array or address of first element
(&ptr + 1) = 0x7fffa7e97790   //address of …
Run Code Online (Sandbox Code Playgroud)

c

5
推荐指数
2
解决办法
1272
查看次数

如何指向字符数组的行为?

我有以下代码片段来理解指针到特定长度的字符数组的工作,使用以下示例代码.

#include <stdio.h>
int main(){

    char sports[5][15] = {

            "cricket",
            "football",
            "hockey",
            "basketball"
    };

    char (*sptr)[15] = sports;

    if ( sptr+1 == sptr[1]){

        printf("oh no! what is this");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如何sptr+1sptr[1]可以相等?因为第一个意味着增加地址,它sptr由一个存储,第二个意味着获取存储在其中的地址的值sptr + 1.

c pointers multidimensional-array

5
推荐指数
1
解决办法
93
查看次数

数组名称是C语言中的指针吗?

我知道C语言中的指针是一个保存地址的变量。例如:

int myVar;
int *p;
p = &myVar;
printf("%p\n", p);
printf("%p\n", &p);
Run Code Online (Sandbox Code Playgroud)

输出将是两个不同的地址,第一个是myVar的地址,第二个是指针本身的地址,这意味着指针也是变量,并且在内存中有一个地址(如果我错了,请更正我)

但是我的问题是关于数组的,例如,我们有以下代码:

int myArray[10];
Run Code Online (Sandbox Code Playgroud)

所以在这里我认为myArray也是一个指针,它保存着myArray的起始地址,在本例中是myArray [0],所以当我打印myArray [0]和myArray的地址时,我得到相同的结果:

printf("%p\n", &myArray[0]);
printf("%p\n", myArray);
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试打印myArray本身的地址时,这对我来说是令人困惑的部分:

printf("%p\n", &myArray);
Run Code Online (Sandbox Code Playgroud)

在这里,我得到了与我希望获得另一个地址(如指针)相同的结果。myArray是标签还是其他东西?

c arrays pointers

5
推荐指数
1
解决办法
84
查看次数

是==*a ?? 关于指针的查询

int main()
{
int a[4][3] = {10,20,30,40,50,60,70,80,90,100,110,120};
printf("%d",((a==*a) && (*a==a[0])));
return 0;
}
Run Code Online (Sandbox Code Playgroud)

在控制台上打印1.有人有逻辑解释吗?

c arrays pointers

3
推荐指数
1
解决办法
141
查看次数

为什么数组变量等于它的地址?

我是 C 编程新手,有一个问题困扰着我。我们看下面这段代码:

int main()
{
   int arr[3]={1,2,3};
   printf("%d\n", arr);
   printf("%d", &arr);
}
Run Code Online (Sandbox Code Playgroud)

如果我运行此代码,它会为 arr 和 &arr 提供相同的结果。但为什么 arr=&arr 呢?我看过很多关于这个主题的答案,但没有一个对我来说是清楚的。简而言之,人们同意数组变量保存数组第一个元素的地址,例如,arr保存arr[0]的地址,比如arr= 4340。那么变量arr必须存储在内存中的某个位置,并且&arr 是存储值 4340 的存储单元的地址。如果 &arr = arr 则结果是 4340 存储在地址 4340 处。但是地址 4340 处的值是数组第一个元素的值,所以它应该是1???我现在很困惑,非常感谢一些帮助。

c arrays

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

当p指向数组时,为什么p和*p给出相同的地址?

我在写这个节目 -

#include<stdio.h>

void main()
{ 
    int arr[20]; 
    arr[0]=22; 
    arr[1]=23; 
    int (*p)[20]=&arr; 
    printf("address in p :%u:\n",p);
    printf("address in *p:%u:\n",*p);
}
Run Code Online (Sandbox Code Playgroud)

对于p和*p,此代码的输出相同!据我所知*p持有arr的基地址,这只不过是arr [0]!所以*p应该给出输出22!但它显示的是像p一样显示的内存地址.请告诉我为什么会这样?它背后的原因是什么?
键盘站点链接:http://codepad.org/LK7qXaqt

c arrays pointers

0
推荐指数
2
解决办法
222
查看次数