什么应该在C中使用双指针?任何人都可以用一个例子来解释
我所知道的是双指针是指向指针的指针.为什么我需要一个指针指针?
在最近的Slashdot访谈中, Linus Torvalds给出了一个例子,说明一些人如何使用指针,表明他们并不真正理解如何正确使用它们.
不幸的是,由于我是他所谈论的人之一,我也不理解他的例子:
我见过太多人通过跟踪"prev"条目删除单链表项,然后删除条目,做类似的事情
Run Code Online (Sandbox Code Playgroud)if (prev) prev->next = entry->next; else list_head = entry->next;每当我看到这样的代码时,我就会去"这个人不理解指针".而且很遗憾很常见.理解指针的人只使用"指向条目指针的指针",并使用list_head的地址初始化它.然后当他们遍历列表时,他们可以在不使用任何条件的情况下删除条目,只需执行即可
Run Code Online (Sandbox Code Playgroud)*pp = entry->next
有人可以提供更多解释为什么这种方法更好,以及它如何在没有条件声明的情况下工作?
我是C的新手,具有良好的java背景,我正在尝试理解指针和数组.
我知道下标operator[]是数组定义的一部分,所以:
int numbers[] = {1,3,4,5};
Run Code Online (Sandbox Code Playgroud)
会创建一个整数数组,它将在内存中表示为16个字节,4个4个字节:
numbers[0] = 1, address 0061FF1C
numbers[1] = 3, address 0061FF20
numbers[2] = 4, address 0061FF24
numbers[3] = 5, address 0061FF28
Run Code Online (Sandbox Code Playgroud)
但是,当涉及指针时,我的知识开始崩溃,所以如果我要创建一个指向数组数字的指针,我将执行以下操作:
int *pNumbers = &numbers[0];
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
而且我猜它的大小是4字节?
然而,**我读作"指针指针"对我来说没有意义,为什么有人想要指针指针,当然如果a-> b-> c然后a-> c就足够了?我知道我错过了一些东西,它必须与数组有关,argv可以是类型char[ ]或char **下面看到的:
int main(int argc, char **argv){}
Run Code Online (Sandbox Code Playgroud)
所以:
**)?当我在C中交换指针时,我一直在努力理解不同的行为.如果我想交换两个int指针,那么我可以做
void intSwap (int *pa, int *pb){
int temp = *pa;
*pa = *pb;
*pb = temp;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想交换两个char指针,我需要做类似的事情
void charSwap(char** a, char** b){
char *temp = *a;
*a = *b;
*b = temp;
}
Run Code Online (Sandbox Code Playgroud)
因为如果我这样做
void charSwap(char* a, char* b){
char temp = *a;
*a = *b;
*b = temp;
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨表达式*a =*b,因为它无法更改值.如果我想交换两个strings(即char* s1= "Hello"; char* s2="Bye";)如何做到这一点?
你能给我一点帮助吗?我想真正了解它是如何工作的,所以在获得正确答案之前我不需要经历反复试验.我希望它对许多其他人有用.
struct counter{
long long counter;
}
struct instruction{
struct counter *counter
int repetitions;
void (*work_fn)(long long *);
};
int ncounter; //number of counters
struct counter *counter; //counter array
int nthreads; //number of threads
int *ninstructions; //number of instructions
struct instruction **instructions;
Run Code Online (Sandbox Code Playgroud)
这实际上是如何工作的?我遇到**指针问题
In tutorial is written:
The type
*Tis a pointer to aTvalue. The&operator generates a pointer to its operand.
I am just playing around with pointers in Go and have following:
example := 42
p:=&example
fmt.Println(reflect.TypeOf(&p)) // **int
fmt.Println(reflect.TypeOf(*p)) // int
Run Code Online (Sandbox Code Playgroud)
So if I got it correctly, &p is a pointer to a pointer to an int value.
What is use of **Type in the Go language?