我前段时间问过一个帐户,我不记得如何操纵基本指针,有人给了我一个非常好的演示
例如
char *ptr = "hello" (hello = a char array)
Run Code Online (Sandbox Code Playgroud)
所以现在*ptr指向h
ptr++ =移动ptr指向下一个元素,得到它的值我做*ptr,这给了我e
好吧到目前为止我希望:D但是现在我需要操纵一个char **ptr并且想知道我是如何以一种模仿二维阵列效果的方式做到这一点的?
一些基本提示将非常感激,因为我需要做一个**ptr模仿二维数组的任务,而不知道它是如何做到这首先意味着我甚至无法在纸上解决它(例如,你如何解除引用**ptr ,你如何获得[x] [y]值等)
谢谢
如果所有地址都已正确设置,您可以使用与下标数组相同的方式下标指针.
假设以下声明:
char **ptr;
Run Code Online (Sandbox Code Playgroud)
以下是各种表达式的类型:
Expression Type Equivalent expressions (yield same value)
---------- ---- -----------------------------------------
ptr char ** &ptr[0]
*ptr char * ptr[0]
*(ptr+i) char * ptr[i]; &ptr[i][0]
**ptr char ptr[0][0]
*(*(ptr+i)) char ptr[i][0]; *ptr[i]
*(*(ptr+i)+j) char ptr[i][j]
从而:
ptr可以治疗的,就好像它是字符串(字符的2-d数组)的数组ptr[i] 指向列表中第i个字符串的开头ptr[i][j] 是列表中第i个字符串的第j个字符的值ptr++和++ptr将推进ptr指向下一个字符串(*ptr)++和++(*ptr)将推进*ptr指向下一个字符至于设置指针,这种安排假定所有内容都已经被分配为静态数组或动态通过malloc.你不能只写
char **ptr = {"foo", "bar", "bletch"}; // using aggregate initializer on
// non-aggregate type; bad juju,
// a.k.a undefined behavior
Run Code Online (Sandbox Code Playgroud)
要么
char **ptr; // ptr has not been initialized to point anywhere
ptr[0] = "foo"; // dereferencing ptr via subscript invokes undefined
ptr[1] = "bar"; // behavior
ptr[2] = "bletch";
Run Code Online (Sandbox Code Playgroud)
通常,当您使用指针时,就像它是一个数组一样,您将使用malloc或类似的东西来分配缓冲区:
char **ptr = malloc(sizeof *ptr * N);
if (ptr)
{
ptr[0] = "foo"; // ptr[i] gets address of
ptr[1] = "bar"; // string literal
ptr[2] = "bletch";
...
}
Run Code Online (Sandbox Code Playgroud)
要么
char **ptr = malloc(sizeof *ptr * N);
if (ptr)
{
size_t i;
for (i = 0; i < N; i++)
{
ptr[i] = malloc(sizeof *ptr[i] * M); // strictly speaking, the sizeof
if (ptr[i]) // is not necessary here
{
//initialize ptr[i]
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4655 次 |
| 最近记录: |