C语言 关于POINTER(指针)的问题, 急!!!!

谁能帮我详细地讲解一下什么是POINTER?作用是什么?在程序当中应该怎么用?
还有它与array、structure的关系,然后是怎么用的。

谢谢啦!,答的好有加分哦。。。

C 的 pointer (指标, 另一常译为指位器)一般是被认为 C 语言中最具威力的工具及

最难以学习的, 事实上 pointer 并不困难.

第一个范例:

/* ====================

pointer - 1

==================== */

#include <stdio.h>

int main()

{

char *s_pointer = “Hello”;

char s[] = “World”;

printf(“%s\n”, s_pointer );

printf(“%s”, s );

return 0;

}

程式执行结果:

Hello

World

先解释一下这一行:

char *s_pointer = “Hello”;

首先编译器会预留一块记忆空间存放 Hello, 再把这个空间的 address (也就是 ‘H’

字元的位址) 设定给 s_pointer.

有点困惑吗? C 的 pointer 与 array 很类似, 基本上 array 只是一块连续的记忆空间,

一个变数存放著这个空间的 address (位址), 而 pointer 也只是一个变数存放著一个

address. 若还是不明白, 在以后我们会以更多的范例来说明 pointer 的观念与使用

以及 pointer 与 array 的关系.

底下的例子:

/* ====================

pointer - 2

==================== */

#include <stdio.h>

int main()

{

char *s_pointer;

char str[] = “Hello World!”;

s_pointer = str;

printf(“%s\n”, s_pointer );

return 0;

}

执行结果:

Hello World!

上面程式中, 所做的事情不是 string copy, 而是将 pointer 所指的 address 设定(assign)

为 str 所指的值, 而此时有 str 及 pointer 指向 “Hello World!”.

再看底下的例子:

/* ====================

pointer - 3

==================== */

#include <stdio.h>

int main()

{

char *s_pointer;

char str[] = “Hello World!”;

s_pointer = str;

s_pointer[0] = ‘h’; /* ‘H’ 转 ‘h’ */

printf(“%s\n”, str );

return 0;

}

执行结果:

hello World!

前面提过, pointer 与 array 其实只是一个变数存放著一个 address, 在前面的 array 章节中

学到的 array 操作自然可以应用(apply)在 pointer 上, 我们把 s_pointer 所指的

address (位址) 上的第一个 element 改成 ‘h’. 又因为 str 所指的 address 与 s_pointer 一样,

所以 printf 输出 str 为 “hello World!”.

底下的例子:

/* ====================

pointer - 4

==================== */

#include <stdio.h>

int main()

{

char *s_pointer;

char str[] = “Hello World!”;

s_pointer = str;

s_pointer = s_pointer + 1; /* 也可写成 s_pointer++ */

printf(“%s\n”, str );

printf(“%s\n”, s_pointer );

return 0;

}

执行结果:

Hello World!

ello World!

既然我们可以指定 pointer 的 address (位址), 自然就可以将现在所指的 address

往前或往后减少或累加, 上例中我们是累加:

s_pointer = s_pointer + 1;

这一行程式会将 s_pointer 所指的 address 加一, 因此原本 s_pointer 是指向 ‘H’,

加一之后变成 ‘e’ 开始.

请参考下图.

str(指向 H )

H
e
l
l
o

W
o
r
l
d
!
NULL

s_pointer (指向 H)

s_pointer = s_pointer + 1 (指向 e)

/* ====================

pointer - 5

==================== */

#include <stdio.h>

int main()

{

char *s_pointer = “Hello”;

char ch1, ch2;

ch1 = *s_pointer;

ch2 = s_pointer[0];

printf(“%c, %c”, ch1, ch2 );

return 0;

}

执行结果:

H, H

程式示范如何以 pointer 运算取出目前 pointer 所指的 address 上的资料,

我们已知 s_pointer 所指的位址及其上面存放的资料, 以 ‘*’ pointer operator

(指标运算元) 可取出所存放的资料, 程式之中比较了等¤的 array 操作,

在程式开发上, 个人是偏爱使用 array operator, 但有些 programmer 认为

使用 pointer operator 编译器产生的 code 较 array operator 快.

以下范例是用 pointer 的间接运算子的例子, 当然也可以用 array operator 做到:

/* ====================

pointer 6

==================== */

#include <stdio.h>

void main()

{

char *str = "Eric";

printf( "%c", *(str+0) ); /* 也可写 printf(“%c”,str[0] ); */

printf( "%c", *(str+1) ); /* 也可写 printf(“%c”,str[1] ); */

printf( "%c", *(str+2) ); /* 也可写 printf(“%c”,str[2] ); */

printf( "%c", *(str+3) ); /* 也可写 printf(“%c”,str[3] ); */

}

程式执行结果:

Eric

看完以上的例子是否更清楚 pointer 的使用, 及 pointer 与 array 之间的关系?

在一个比较大的软体开发计划中, 常常 要动态向系统要求记忆体, 以下是一个范例:

/* ================

memory allocation/free 1

================ */

#include <stdio.h>

#include <stdlib.h>

int main()

{

char *str;

char s[] = “Hello World!”;

int length;

length = strlen( s ) + 1; /* 求得 s 长度, 加 1 是因为结束字元. */

str = (char*)malloc( length ); /* 向O.S 要 memory */

strcpy( str, s );

printf(“%s\n”, str );

str[0] = ‘h’;

printf(“%s\n”, s );

free( str );

return 0;

}

程式执行结果:

Hello World!

Hello World!

strlen 是 C 的 standard library 中求得 string length 的一个 function, 取得 s 的长度之后

加 1 是因为 strlen 并不会把结束字元算进字串的长度. 另外程式中,

以 malloc 这个函数向系统索取一块记忆空间, malloc 传回这个空间的 address.

str = (char *)malloc( length );

其中, (char *)是我们强制转型, 将 malloc传回的 pointer 型态转型与 str 一致为

(char *). 接著再以 strcpy 将 s 里面的字元 copy 至 str.

程式后面的 str[0] = ‘h’ 只是为了证明 str 与 s 所指的 address 及资料是完全不同的.

程式中以 free 这个 function 释放(release) 之前向系统索取的空间, 所谓有借有还,

维持良好的程式开发习惯.

/* ================

memory allocation/free 2

================ */

#include <stdio.h>

#include <stdlib.h>

int main()

{

char *str;

char s[] = “Hello World!”;

int length;

length = strlen( s ) + 1;

str = (char*)malloc( length ); /* 向O.S 要 memory */

if( str == NULL )

{

printf(“Memory allocation failed”);

return 0;

}

strcpy( str, s );

printf(“%s”,str );

free( str );

return 0;

}

执行结果, 记忆空间充足的情况”

Hello World!

或记忆空间不足时:

Memory allocation failed

上面的程式中, 我们多了一个判断, 判断 str 是否为 NULL, 若为 NULL 则印出

”Memory allocation Failed”, 接著离开程式返回系统, 因为 malloc 在无法取得

你所 大小的记忆空间时会传回 NULL. 这一个判断是必 的, 特别是在开发

大型系统时要处理这些问题.

最后谈到的是 & 位址运算元, 这个运算元符号虽然与 Bitwise AND 一样,

但用法不同, Bitwise AND 的用法是:

Identifier1 & Identifier2

而现在说的位址运算元是:

&Identifier

本运算元会传回 Identifier 的 Address(位址), 在 C 中, 所有的 variable (变数)

都存在一个实体的记忆体空间中, 当你 要知道这个变数存放的位址时,

就可以使用 “&” operator.

/* ====================

& operator.

==================== */

#include <stdio.h>

int main()

{

int *pointer_a, a;

pointer_a = &a;

a = 10;

printf(“%d, %d”, a, *pointer_a );

return 0;

}

执行结果:

10, 10

程式中, 将 a 的 address 设给 pointer_a (另一说法是: 把 pointer_a 这个 pointer 指向 a ),

因此 pointer_a 所”指”的 address 与 a 的 address 一样, 所以 a, 与使用 *pointer_a 取出

指向的位址上的资料是一样的.

在前面的”C的输出与输入”章节中, 函数 scanf 的参数皆是 pointer, 所以我们以

“&” operator 将变数的 address 传入.

参考资料:http://student.zjzk.cn/course_ware/gaojiyuyan/ckzl2/webver/ch27.htm

温馨提示:内容为网友见解,仅供参考
第1个回答  2009-06-17
你用什么书学习C语言的
不可能不讲指针,好好看书吧,C语言的精华和糟粕都在于指针
第2个回答  2009-06-17
http://student.zjzk.cn/course_ware/gaojiyuyan/ckzl2/webver/ch27.htm
建议去看看里面的例子!本回答被提问者采纳
第3个回答  2009-06-17

我也正在学习中
指针就是地址,作用是指向一个变量的地址
第4个回答  2009-06-17
这个找本书看看吧
指针是一个指向地址的变量

C语言 关于POINTER(指针)的问题, 急!!!
程式中, 将 a 的 address 设给 pointer_a (另一说法是: 把 pointer_a 这个 pointer 指向 a ), 因此pointer_a 所”指”的 address 与 a 的 address 一样, 所以 a, 与使用 *pointer_a 取出 指向的位址上的资料是一样的. 在前面的”C的输出与输入”章节中, 函数 scanf 的参数皆是 pointer, 所以我...

有关于计算机C语言的Pointer问题
在探讨计算机C语言的Pointer问题时,我们需要首先理解Pointer的基本概念。Pointer是一种存储变量地址的变量,它在C语言中扮演着至关重要的角色。让我们逐一解析这六种情况,以更直观的方式理解Pointer。1. 定义一个整型变量k,并将k的地址赋给指针t。这表示我们创建了一个指向整型变量的Pointer,可以用来操...

C语言指针问题。
(1) ++(*pointer)是先取值,再自增,当前pointer指向的是位置arr[3],取值后是2,*pointer的结果是2,2再自增,当然会得出3。值得说明的是,这个括号是可以省略的,此处括号只起到增加程序可读性的作用。(2)*(pointer-2)是先移动指针,再取值。pointer-2是把指针从当前位置arr[3]回退两...

c语言指针是什么 c语言指针介绍
1、c语言指针其实是一个整形变量,与其它数据不同的是,它的作用是用来存储其它变量的地址。指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。2、因此,将地址形象化的称为...

C语言指针新手问题*pointer_1=100
此时,*pointer_1 只是表示定义的是个指针变量,并没有间接取值的意思。 当“=”的左操作数是*pointer_1时,改变的是pointer_1所指向的地址存放的数据;当“=”的左操作数是pointer_1时,改变的是pointer_1所指向的地址。也就是说pointer_1 = &a 实际上是把a的地址给了pointer_1,如果a的地址...

C语言中字符指针的问题 char *pointer = "Hello World!"; printf...
回答:这里的 pointer 指向的是一个字符串,字符串的首地址赋给 pointer printf("%s\\n",pointer); \/\/输出Hello World!\/\/ printf 遇到指向字符串的指 \/\/针时,输出字符串(就是这样定义的) printf("%s\\n",*pointer); \/\/输出H printf("%d\\n",pointer); \/\/输出pointer指向的地址

c语言,*p+1到底是指针指向的数值加一,还是指针指向第2个数组元素??_百...
是指针指向的数值加一,(p+1)是指针指向第2个数组元素 格式控制符“%p”中的p是pointer(指针)的缩写。指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。示例:...

C语言中的指针为什么会改变变量的值?
pa=&a;句是将指针*pa指向变量a。pa存放的是a的地址,*pa其实就是a,可以理解为把a换了一个名字表示。*pa=20就是对a进行赋值操作,等于a=20;a的值当然改变了。看看指针的知识吧!

c语言指针问题
(2),对于*P1=*P2 操作之前,一定要先将P1和p2先指向变量。还有*p=3之前,也要先把p指向一个变量。指针就是一个指向地址的变量,使用之前需要先给它赋值,也就是先将将一个变量的地址赋值给它,这个时候指针里面存的就是这个变量的地址。理解了指针的概念,上面这些问题就好理解了~...

关于C语言指针的问题
(5)int *(*ptr)[4]; \/\/指针所指向的的类型是 int *()[4] 在指针的算术运算中,指针所指向的类型有很大的作用。 指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。当你对C越 来越熟悉时,你会发现,把与指针搅和在一起的"类型"这个概念分成"指针的 类型"和"指针所指向的类型"两个概念,是...

相似回答