我找到了一个计算数字平方的函数:
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)
我知道一个数组衰减到指针,如果一个声明
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++中,我编写了以下简单的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)
它给了我相同的结果a和b.为什么是这样?我希望第二个是第一个地址的符号.
我是指针和学习指针基础知识的新手.我想从下面的代码中了解*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) 我有以下代码片段来理解指针到特定长度的字符数组的工作,使用以下示例代码.
#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+1和sptr[1]可以相等?因为第一个意味着增加地址,它sptr由一个存储,第二个意味着获取存储在其中的地址的值sptr + 1.
我知道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是标签还是其他东西?
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 编程新手,有一个问题困扰着我。我们看下面这段代码:
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???我现在很困惑,非常感谢一些帮助。
我在写这个节目 -
#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