我正在学习指针算术并且有一段代码在很长一段时间内给我错误.任何帮助将不胜感激.(我无法在SO上找到它)
int arr [] = {1, 2, 3, 4, 5} ;
for (int i = 0 ; i < 5 ; i++)
{
cout << *arr ;
arr++ ;
}
cout << *arr << endl ;
Run Code Online (Sandbox Code Playgroud)
我无法理解我在codeblocks中遇到的错误.我收到这个声明.
error: lvalue required as increment operand|
||=== Build finished: 1 errors, 0 warnings ===|
Run Code Online (Sandbox Code Playgroud)
在此代码中,我必须迭代数组,而无需解除引用或使用 [] 运算符.
假设我宣布 int v[]={1,2,3,4,5};
我被教导过这v是指向v数组中第一个元素的指针.当我调用apply sizeof时v,它返回20,我知道是5*sizeof(int),因为数组中有5个元素.
v+0也是指向数组中第一个元素的指针,但是sizeof(v+0)为4.
为什么sizeof(v)= 20和sizeof(v+0)= 4?
我希望它sizeof(v)也返回4,就像v一个指针,但它以某种方式还包含有关存储在数组中的元素数量的信息.对此有何解释?
struct S {
double arr[1];
S(double arr[1]) : arr(arr) {}
};
int main(void) {
double arr[1] = {1.2};
S p(arr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
嗨,这是我在代码中遇到的一个提取问题.
你知道为什么这段代码不能编译吗?
main.cpp: In constructor ‘S::S(double*)’:
main.cpp:26:28: error: incompatible types in assignment of ‘double*’ to ‘double [1]’
S(double arr[1]) : arr(arr) {}
Run Code Online (Sandbox Code Playgroud)
我正在使用g++,编译和运行
g++ -std=c++17 main.cpp kdtree.h kdtree.cpp && ./a.out
Run Code Online (Sandbox Code Playgroud) 我有一个c ++编程类的作业,用于在不使用静态变量的情况下编写递归函数,使用以下原型:int findmin(const int a [],int n);
我的解决方案是有效的(对于非常小的数组),但我认为~2 ^ n复杂度过高并且可以改进.
是否可以在指定的标准内进行任何改进,以提高效率?
int findmin(const int a[], int n)
{
if(n == 0)
return a[0];
else
{
if(a[n-1] < findmin(a,(n-1)))
return a[n-1];
else
return findmin(a,(n-1));
}
}
Run Code Online (Sandbox Code Playgroud) 我发现了一些关于对象和STL的"Heap vs Stack"问题和答案.(c ++ arguments heap-vs-stack)(请告诉我,如果向量或队列等STL对象与自定义类对象的行为不同.)
在处理编程竞赛问题之一时,我发现原始类型的数组也作为参考传递而不是手动复制(例如f(bool boo[10][10])).
我通过使用基本类型的本地数组并将参数复制到本地数组来解决这个问题.
bool local_boo[10][10]; memcpy(local_boo, boo, sizeof(bool) * 10 * 10);
此外,可以安全地假设,boo当原始类型数组的大小已知并且已修复时,我将仅尝试具有每个函数调用的单独副本.
这是我的问题.
1)有更好的方法吗?
2)有没有人知道任何一个好的引用,专门针对函数调用期间是否将通过堆或堆栈传递参数?
3)有没有更好的方法来确定是否在堆或堆栈上声明了某些内容而不是打印变量的地址并通过检查地址来确定?
谢谢.
我有一个ptrArr1带有两个元素的指针数组().我希望动态分配指针数组.我可以很好地为指针数组的第一个元素分配一个地址,但我不知道如何为指针数组的第二个元素分配一个地址.我不希望使用任何STL或其他预编码功能.我正在做这个练习,以增强我对指针的理解.谢谢.
int main()
{
int one = 1;
int two = 2;
int *ptrArr1 = new int[2];
ptrArr1 = &one;
ptrArr1[1] = &two; //does not work
ptrArr1 + 1 = &two; // does not work
delete[]ptrArr1;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我已阅读以下帖子:
这表明返回了指向堆分配变量的指针。但是,指针在技术上是否是“堆栈分配的变量”,则在返回函数时将释放该指针?
例如:
int* test(){
int arr[5];
int *ptr = arr;
return ptr; //deallocated ptr?
}
int *test2(){
int arr[5];
return arr;
}
Run Code Online (Sandbox Code Playgroud)
在测试中
另外,说arr是指向某个新创建的int数组arr的指针是正确的&arr[0]。如果arr不是指针,为什么返回满足函数返回类型的有效指针?
由于ptr和arr都应该是堆栈分配的,为什么代码只能在其中工作test()而不能test2()?test()是否给出未定义的行为?
这个简单的代码是我所期望的:
#include <stdio.h>
int main()
{
char input[20];
printf("enter a string: ");
scanf("%[^\n]s", input);
printf("input: %s\n", input);
}
Run Code Online (Sandbox Code Playgroud)
哪里input是(char*)[20]。但是为什么我可以通过这个:
#include <stdio.h>
int main()
{
char input[20];
printf("enter a string: ");
scanf("%[^\n]s", &input);
printf("input: %s\n", input);
}
Run Code Online (Sandbox Code Playgroud)
它仍然编译和运行?&input传递的参数应该是(char**)[20]哪个不正确,但它运行。为什么?
template <class T>\nvoid func(T*& a)\n{\n\n}\n\nint main()\n{\n int a[5];\n func(a); // <-- Error here: no matching function for call to \xe2\x80\x98func(int [5])\xe2\x80\x99\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n为什么int[]不隐式转换为int*以便可以匹配模板函数?
我基本上寻找一种将数组的大小/长度传递给函数的"动态"方式.
我试过了:
void printArray(int arrayName[])
{
for(int i = 0 ; i < sizeof(arrayName); ++i)
{
cout << arrayName[i] << ' ';
}
}
Run Code Online (Sandbox Code Playgroud)
但我意识到它只考虑它的字节大小而不是数组上有多少元素.
并且:
void printArray(int *arrayName)
{
while (*arrayName)
{
cout << *arrayName << ' ';
*arrayName++;
}
}
Run Code Online (Sandbox Code Playgroud)
这至少打印了我所有的东西,但超出了我的预期,所以它实际上并不像我想要的那样.我认为这是因为我并没有确切地告诉它我需要它有多大所以它"安全"并且给我一些大的尺寸并最终在我的阵列中的最后一个元素之后开始打印非常奇怪的整数.
所以我终于完成了这项工作,但我相信那里有更好的东西!:
void printArray(int *arrayName)
{
while (*arrayName)
{
if (*arrayName == -858993460)
{
break;
}
cout << *arrayName << ' ';
*arrayName++;
}
cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)
运行程序几次之后,我意识到我输入的数组的最后一个元素之后的值总是:-858993460,所以一旦遇到这个值,我就把它打破了while循环.
include <iostream>
include <conio.h>
using namespace std;
// functions …Run Code Online (Sandbox Code Playgroud)