我是编程新手,目前我正在学习C中的指针.
我的问题是我已经读过,如果我们想要改变变量的值,我们必须将指针传递给它(即我们想要修改的值的位置).这是什么意思?我的意思是,我们必须传递指向函数的指针吗?声明的含义是什么,"我们必须将指针传递给我们想要修改的位置".
我发现通过现实世界的比较隐喻我学得最好.例如,在java中,帮助我理解Accessors和Mutators概念的一种方法是通过中间人的概念来思考它(私有变量不喜欢直接处理他们的客户,他们更喜欢有中间人(访问者和变异者)处理它们)
C中指针的概念对我来说仍然有点棘手.用什么来描述它们是如何工作的好比喻是什么?
我正在学习指针,我遇到了这个程序:
#include <stdio.h>
void swap(int *,int *);
int main()
{
int a=10;
int b=20;
swap(&a,&b);
printf("the value is %d and %d",a,b);
return 0;
}
void swap(int *a,int*b)
{
int t;
t=*a;
*a=*b;
*b=t;
printf("%d and%d\n",*a,*b);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我为什么这个主函数返回值反转?到目前为止我理解的是C中的函数调用不会影响main函数及其值.
我也想知道指针变量占用的空间有多少像整数一样占用了2个字节以及各种应用程序的使用和指针的优点......
我正在使用Keil C51编译器来编程8051微控制器.由于某些原因,我的代码没有运行 - 我设法追踪错误,但我仍然难以理解它.为什么第一个代码与另一个代码相比是错误的?值得注意的是,编译器没有抛出任何错误,代码甚至没有在微控制器上启动.
错误的代码:
file1.h
extern STRUCT_TYPEDEF array_var[];
Run Code Online (Sandbox Code Playgroud)
file2.c中
// Global variable initialization
STRUCT_TYPEDEF array_var[] = some_struct.array2_var;
Run Code Online (Sandbox Code Playgroud)
将这些更改为:
file1.h
extern STRUCT_TYPEDEF *array_var;
Run Code Online (Sandbox Code Playgroud)
file2.c中
// Global variable initialization
STRUCT_TYPEDEF *array_var = &some_struct.array2_var[0];
Run Code Online (Sandbox Code Playgroud)
它开始工作了.
此外,这部分代码仅在类似"array_var [0] .property = ..."的函数中引用,但这些函数都没有从应用程序中调用过.
some_struct变量在另一个模块中声明.
它为什么会这样?[]和*之间有什么区别我不知道吗?
EDIT1: 据说指针和数组是不同的东西......但是,"[]"语法与"*"的区别是什么?我认为只要方括号为空(例如函数参数),编译器就会将其转换为指针.我还认为提供一个数组会导致给我第一个元素的地址.
现在,每个人都在说指针和数组是不同的 - 但我找不到任何关于它们究竟有什么不同的信息.当我将数组作为rvalue而不是指向其第一个元素的指针时,编译器如何看待它?
我了解指针的前提,但是我觉得它很烦人,我不明白为什么它被认为有用:
#include <stdio.h>
int main () {
int *ptr, q;
q = 50;
ptr = &q;
printf("%d", *ptr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么这是一个基本概念?
在我投射之后,我无法设置属性的值.我不确定这是否被称为拳击.
无论如何,新的变量正在设置,但原始的不是.我认为新变量只是对原始变量的引用.但是当我检查intellisence/debug观察器时,原始属性仍为null.
这是代码.
// NOTE: data is either a Foo || FooFoo || FooBar, at this point.
// only Foo impliments ITagElement.
if (data is ITagElement)
{
var tags = ((ITagElement)data).TagList;
// At this point, tags == null and data.TagList == null.
if (tags.IsNullOrEmpty())
{
tags = new List<Tag>();
}
tags.Add(new Tag
{
K = xmlReader.GetAttribute("k"),
V = xmlReader.GetAttribute("v")
});
// At this point, Tags.Count == 1 and data.TagList == null :( :( :(
}
Run Code Online (Sandbox Code Playgroud)
请注意有关该值我行内注释 …
如果我错了,有人可以检查我的理解并纠正我吗?
int p = 5; //create an int holding 5
int *ptr; //create a pointer that can point to an int
*ptr = &p; // not sure - does this mean that my pointer now points to memory address five, or that the memory address my pointer points at contains 5?
Run Code Online (Sandbox Code Playgroud)
对不起基本的问题 - 我很快就有一个需要使用指针的assignmnet,我真的想在它设置之前破解基础知识.
正如标题所示,我无法准确理解指针是什么以及为什么使用它们.我已经搜索了一下但仍然不太懂.我主要在Objective-C工作,但从我读过的内容来看,这更像是一个C主题(所以我添加了两个标签).
根据我的理解,前面带星号的变量指向内存中的地址?我不太明白为什么你使用指向值的指针而不是仅仅使用值本身.
例如:
NSString *stringVar = @"This is a test.";
Run Code Online (Sandbox Code Playgroud)
在这个字符串上调用方法时,为什么它是一个指针而不是直接使用字符串?为什么不使用指向整数和其他基本数据类型的指针?
有点偏离主题,但我是否正确标记了这个?在我编写它时,我认为它更像是一个编程概念,而不是特定于语言的东西,但它确实专注于Objective-C,所以我用objective-c和c标记它.
似乎在其他地方找不到我的问题的答案。
考虑代码:
int *ptr = malloc (sizeof (*ptr));
int *dummyPtr = ptr;
free (dummyPtr);
printf ("ptr: %p, dummy: %p\n", ptr, dummyPtr);
Run Code Online (Sandbox Code Playgroud)
据我了解,free()接受一个指针并使其指向NULLaka (nil)。即,指针被取消引用并且指向任何地方。这意味着指针指向的内存被有效擦除。
这个问题分为两个部分:
dummyPtr似乎仍然指向内存中的地址而不是(nil). 为什么?ptr?它仍然指向该内存块还是也被取消引用?我已经多次运行此代码和某些变体,但结果相互矛盾。有时只有副本受到影响,有时两者都受到影响。有时指向的值甚至设置为零!
坦白说,我不知道发生了什么事。(我正在运行 Debian,如果这有什么区别的话。)
#include <iostream>
using namespace std;
int main() {
int *p1;
p1 = new int;
int *p2;
p2 = new int;
p2 = p1; // what happens here?
*p1=5;
cout << "pointer 2 is " << *p2 << endl << *p1 << endl; // both give out 5
delete p1; // what happens to p2 ?
cout << "pointer 2 is " << *p2 << endl;
delete p2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我删除指针对象 p1 时会发生什么?什么是指针 p2 现在引用?有人能解释一下吗?谢谢您的帮助