您的位置:首页 > 编程语言 > C语言/C++

黑马程序员——C语言之指针常用方法小结

2014-11-30 18:58 344 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

概述:本小结着重讲解

1.什么是指针

2.使用指针来操作基础数据类型

3.使用指针来操作字符串

4.使用指针来操作字符串

5.使用指针来操作结构体

6.函数中的指针

1.什么是指针

我在看视频学习C的过程中,看到李明杰老师说,学习C语言,没学会指针,就相当于没学过C语言。这句话我很赞同,指针是C语言的一大特色,功能十分强大,一定好好好学会。

那么什么是指针呢?

按我的理解:一般变量在内存中声明后都有一个变量名来对应,使用该变量名即可查看修改该变量,但同时,也可以通过变量的地址来查看修改该变量,而指针就是用来保存该变量的地址的。

2.使用指针来操作基础数据类型

C语言的指针是用来指向各个变量的地址的,虽然C语言有多种数据类型,但这些类型的地址格式都是一致的,因此指向这些类型的指针都是四个字节大小(以win7 32位系统为例)。

如下是C语言的数据类型图:



基础数据类型的指针定义方法如下,其中 * 是得到地址对应的变量, & 是得到变量的地址:

char c = ‘a’;

char *pc = &c;

int a = 1;

int *pa = &a;

以此类推。。。

使用基础数据类型的指针方法如下:

char c = ‘a’;

char * pc = &c; //让指针指向同一基础类型的变量

*pc = ‘b’;

printf(“c=%c,*pc=%c\n”,c,*pc);

输出结果:c=b,*pc=b

使用注意:

1. 声明方式可以char * pc = &c;或者 char *pc; pc=&c;

但是不可以 char *pc; *pc=&c;

2. 同一种类型的指针只能指向相同类型的变量。

3. 不可以把地址直接赋值给指针变量:

char * pc;

pc = 1000; //错误写法,不能直接赋值地址。

3.使用指针来操作字符串

C语言中,没有String 类型,字符串可以有2种表示方式:

1. char * pname = “xiaohong”,

2. char name[] = “xiaohong”;

第一种方式就是采用指针方式来实现的,这2种方式有如下差别:

1. sizeof(pname)结果是 4,sizeof(name) 结果是9,因为对指针求sizeof()得到的只会是指针的字节数,永远都是4。而对数组用sizeof()则得到的数组的字节数。

2. 使用指针指向的字符串无法被修改值,只能读取,不能使用*(p+1)=’x’的方式修改值,会报错。

使用数组存储的字符串可以修改字符串的字符,如 name[1]=’x’。

4.使用指针来操作数组

定义一个数组并赋值:

int ages[] = {10,3,1,99,0,8}

可以使用指针指向这个数组:

int *page;

指向方之一:

page = ages; //指向数组名

指向方式二:

page = &ages[0]; //指向数组首个元素

通过指针操作数组元素:

读取: printf(“%d\n”,*(page+1));

修改: *(page+1)=99; printf(“%d\n”,*(page+1));

注意:使用指针指向数组中的不同元素时 *(p+1) 中加1 指的是向后移动一个元素的位置,而非指针地址移动一个字节!

5.使用指针来操作结构体

结构体如下:

struct student{

intid;

char*pname;

intscore;

};

可以直接定义结构体变量,也可以使用指针操作结构体

struct student std,*pstd;

pstd = &std; //指向结构体变量

变量操作结构体内容:

std.id = 1;

std.name = “xiaohong”;

std.score = 90;

指针操作结构体内容:

pstd->id = 2; //指针可以采用 -> 的形式访问成员变量

(*pstd).name = “xiaoming”; //指针也可以采用 . 的方式访问成员变量。

pstd->score = 60;

注意:指针指向结构体变量时,只能指向结构体变量的名字,不能指向结构体中的成员变量。

6.函数中的指针

指针在函数中的用途很广泛,其中最常用的就是解决了函数参数传递时基础类型参数是值传递的问题。

如:

#include<stdio.h>

int * chuanzhi(int i,int *j){

i= 100;

*j= 100;

}

void main(){

inti = 0;

intj = 0;

int* jj = NULL;

jj= chuanzhi(i,&j); //比较值传递和指针传递的不同。

printf("i=%d,j=%d,jj=%d\n",i,j,*jj);

}

输出结果:


以上的例子显示了值传递与地址传递的不同,同时显示了函数也能返回指针类型的值。

注意:

1.除了基本类型是值传递外,如果在函数中传递类似结构体、数组、字符串等变量的名字也是属于指针传递。

总结:如上列出的是平时使用较多的关于指针的知识,C语言中的指针博大精深,还有很多用法,例如指向函数的指针,指向指针的指针等等。好好学习C中的指针对于将来的学习大有裨益。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: