我正在慢慢掌握指针.但是我还有一些问题.
使用指针运算时是否可能导致内存泄漏,因为您正在移动指针指向的实际位置?
我的意思是,如果说我向上计数要用char复制字符串char,我是否需要倒数以便C"知道"指针指向的位置?
谢谢弗兰克
我只是试图使用一个指向整数数组的void指针,我试着看看我是否可以通过将数组转换回int来打印它.但它给了我一些随机价值.你能告诉我哪里出错了吗?
#include<stdio.h>
#include<stdlib.h>
int main(){
int a[5];
int x;
int j;
a[0]=1;
a[1]=2;
a[2]=3;
a[3]=4;
void *arr=a;
for(j=0;j<4;j++){
x = *(int *)(arr+j);
printf("%d",x);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是这样的:
133554432131072512
Run Code Online (Sandbox Code Playgroud)
为什么它没有固定数组的元素a []即1,2,3,4?
有人可以解释以下代码的输出
char* a[] = {"ABC123", "DEF456", "GHI789"};
char **p = a;
cout<<++*p<<std::endl;
cout<<*p++<<std::endl;
cout<<++*p<<std::endl;
Run Code Online (Sandbox Code Playgroud)
输出:
BC123
BC123
EF456
Run Code Online (Sandbox Code Playgroud)
令我困惑的是++*p和*p ++的不同行为.我期待输出为:
ABC123
DEF456
GHI789
Run Code Online (Sandbox Code Playgroud) 我对如何执行此代码感到困惑.假设我们有
int x=30,*y,*z;
y=&x;
Run Code Online (Sandbox Code Playgroud)
*y ++和++*y之间有什么区别?以及该计划的产出是什么?
#include<stdio.h>
int main(){
int x=30,*y,*z;
y=&x;
z=y;
*y++=*z++;
x++;
printf("%d %d %d ",x,y,z);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试一些非常简单的事情,应该很简单,但它不知何故让我感到烦恼......
我试图理解++对数组的影响,当被视为数组时被视为指针和指针.
所以,
int main()
{
int a[4] = { 1, 4, 7, 9 };
*a = 3;
*(a+1) = 4;
*++a = 4; //compiler error
}
Run Code Online (Sandbox Code Playgroud)
1:所以在*(a+1)=4我们设置[1] = 4; //快乐但是,当*++a = 4;我想要指针a增加一个因为++先于*然后*启动而我们使它等于4.但是这个代码不起作用......为什么会这样?
另一个问题:
int main()
{
int* p = (int *)malloc(8);
*p = 5;
printf("%d", p[0]);
*++p = 9; //now this works!
printf("%d", p[1]); //garbage
printf("%d", p[0]); //prints 9
}
Run Code Online (Sandbox Code Playgroud)
2:现在*++ p = 9; 工作得很好,但它的表现并不像数组.两个有什么不同?这只是递增p,并使其等于9.如果我打印p [0],它现在打印9,我看到虽然不能通过p [0]访问它,*(p-1)显示5还在那里.所以用[0]索引指针,它究竟指向哪里?发生了什么变化?
非常感谢所有专家!
今天我写了一些看起来像这样的东西:
void foo(std::vector<char>&v){
v.push_back('a');
char*front=&v.front();
char*back=&v.back();
size_t n1=back-front+1;
v.push_back('b');//This could reallocate the vector elements
size_t n2=back-front+1;//Is this line valid or Undefined Behavior ?
}
Run Code Online (Sandbox Code Playgroud)
如果当我按下"b"时发生重新分配,我还可以计算出我的两个指针的差异吗?
在阅读了标准的相关段落几次之后,我仍然无法在这一点上思考.
C++ 11 5.7.6:当减去指向同一数组对象元素的两个指针时,结果是两个数组元素的下标的差异.结果的类型是实现定义的有符号整数类型; 此类型应与标题(18.2)中定义为std :: ptrdiff_t的类型相同.与任何其他算术溢出一样,如果结果不适合所提供的空间,则行为未定义.换句话说,如果表达式P和Q分别指向数组对象的第i和第j个元素,则表达式(P) - (Q)具有值i-j,条件是该值适合于std :: ptrdiff_t类型的对象.此外,如果表达式P指向数组对象的元素或者指向数组对象的最后一个元素,并且表达式Q指向同一数组对象的最后一个元素,则表达式((Q)+1) - (P)具有与((Q) - (P))+ 1和 - ((P) - ((Q)+1))相同的值,并且如果表达式P指向一个,则值为零数组对象的最后一个元素,即使表达式(Q)+1没有指向数组对象的元素.除非两个指针指向同一个数组对象的元素,或者指向数组对象的最后一个元素,否则行为是未定义的.
当然我知道它有效,我只是想知道它是否合法.
c++ pointer-arithmetic undefined-behavior language-lawyer c++11
如果我写
int main(int argc, char *argv[])
{
int temp[50][3];
return &temp[argc] - &temp[0];
}
Run Code Online (Sandbox Code Playgroud)
并使用Visual C++编译它,我回来了:
009360D0 55 push ebp
009360D1 8B EC mov ebp,esp
009360D3 8B 45 08 mov eax,dword ptr [argc]
009360D6 8D 0C 40 lea ecx,[eax+eax*2]
009360D9 B8 AB AA AA 2A mov eax,2AAAAAABh
009360DE C1 E1 02 shl ecx,2
009360E1 F7 E9 imul ecx
009360E3 D1 FA sar edx,1
009360E5 8B C2 mov eax,edx
009360E7 C1 E8 1F shr eax,1Fh
009360EA 03 C2 add eax,edx
009360EC …Run Code Online (Sandbox Code Playgroud) c++ code-generation multiplication pointer-arithmetic visual-c++
我一直在学习C语言,并跟随Yashavant P. Kanetkar的"Let Us C".
指针章节中有一行说我们只能比较指向同一数组中元素的指针,即小于(<)和大于(>)指针.
为什么比较任意指针无效?
我有一个代码,其中执行如下操作:
double computeSometing(const double * parameters)
{
return useValues(parameters - 10);
// in this special case, useValues only uses values that are
// at least at parameters[0] or after
}
Run Code Online (Sandbox Code Playgroud)
这看起来很糟糕,但是仅在以下情况下才调用此代码:在这种情况下,我知道useValues在10号之前不会使用任何值(情况并非总是如此),因此所使用的所有值都是“ inside” parameters。那是不确定的行为吗?我知道它只能在我使用过的所有编译器/平台上运行,但这并没有定义它。
我这样做是为了避免将其内容复制parameters到具有10个以上元素的新数组中,因为此函数对性能敏感。
我试图理解为什么以下C++代码无法编译
int main () {
int a[10];
int (*p)[10] = &a;
int *q = static_cast<int *>(++p);
}
Run Code Online (Sandbox Code Playgroud)
如果不是很明显,我试图做的是通过使用指针算法找到指向数组末尾的指针.
到目前为止,我的理解是p具有十个整数数组的类型指针,表达式也是如此++p.通常,我可以将一个int数组分配给指向int的类型指针的变量,但这会在递增的指针上失败++p.
我第一次尝试没有,static_cast但也没有用.