首页 > 代码库 > 黑马程序员—08-指针

黑马程序员—08-指针

一、   指针前奏

1. 指针的重要性

指针是C语言中非常重要的数据类型,如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。

2. 小需求

l   voidchange(int  n)函数调用完毕后,改变实参的值

l   分析:修改实参的值->找到存储空间->地址

 

二、   指针变量的定义

1. 定义的格式

l  类名标识符  *指针变量名;

l   int*p;

2. 先定义后赋值

l   简单取值

int a = 10;

int *p;

p = &a;

3. 定义的同时赋值

int a = 10;

int *p = &a;

4. 注意点

l  指针变量是用来存放变量地址的,不要给它随意赋值一个常数。下面的写法是错误的

l  int *p;

l p = 200; // 这是错误的

l   %p输出指针里面存储的地址值

l   其他指针类型说明,比如float *p;  char *p;

l   不能乱用类型,比如int a = 10;  float *p =&a;

5. 清空指针

l   p =0;

l   p =NULL;

 

三、   指针实例 

l 给指针指向的变量赋值

 1 char a = 10;

 2 printf("修改前,a的值:%d\n", a);

 3

 4 // 指针变量p指向变量a

 5 char *p = &a;

 6

 7 // 通过指针变量p间接修改变量a的值

 8 *p = 9;

 9

10 printf("修改后,a的值:%d", a);

技术分享

 

a值是10,p值就是变量a的地址ffc3。

注意下第5、第8行,都有个"*",它们的含义是不一样的:

(1) 第5行的"*"只是用来说明p是个指针变量

(2) 第8行的"*"是一个指针运算符,这里的*p代表根据p值ffc3这个地址访问对应的存储空间,也就是变量a的存储空间,然后将右边的数值9写入到这个存储空间,相当于 a = 9;,于是内存中就变成这样了

 

输出结果为: ,可以发现,我们通过变量p间接修改了变量a的值。

l  举例!!!这是mj老师当时举得一个对我印象特别深的例子!!!!!!!!!!!!!!!!!!!

 

 

四、   指针探究

1.  指针变量所占用的存储空间占用8个字节

 

五、   指针与数组

1. 指向一维数组元素的指针

1 // 定义一个int类型的数组 2 int a[2]; 3  4 // 定义一个int类型的指针 5 int *p; 6  7 // 让指针指向数组的第0个元素 8 p = &a[0]; 9 10 //修改所指向元素的值11 *p = 10;12 13 // 打印第一个元素的值14 printf("a[0] = %d", a[0]);

 

2. 用指针遍历一维数组元素

 1 // 定义一个int类型的数组 2 int a[4] = {1, 2, 3, 4}; 3  4 // 定义一个int类型的指针,并指向数组的第0个元素 5 int *p = a; 6  7 int i; 8for (i = 0; i < 4; i++) { 9     // 利用指针运算符*取出数组元素的值10     int value = http://www.mamicode.com/*(p+i);11 12 printf("a[%d] = %d \n", i, value);13 }

技术分享

p是指针,a是一个数组

 

六、   指针与字符串

char *s;

s = "mj";

上面的指向方式也是正确的:先定义指针变量,再指向字符串。如果是字符数组就不允许这样做,下面的做法是错误的:

1 char s[10];

2 s = "mj";

编译器肯定报第2行的错,因为s是个常量,代表数组的首地址,不能进行赋值运算。

还需要注意的是,下面的做法也是错误的:

1 char *s = "mj";

2

3 *s = "like";

第3行代码犯了2个错误:

·       第3行代码相当于把字符串"like"存进s指向的那一块内存空间,由第1行代码可以看出,s指向的是"mj"的首字符‘m‘,也就是说s指向的一块char类型的存储空间,只有1个字节,要"like"存进1个字节的空间内,肯定内存溢出

·       由第1行代码可以看出,指针s指向的是字符串常量"mj"!因此是不能再通过指针来修改字符串内容的!就算是*s = ‘A‘这样"看起来似乎正确"的写法也是错误的,因为s指向的一个常量字符串,不允许修改它内部的字符。

 

现在想将字符串"lmj"的首字符‘l‘改为‘L‘,解决方案是多种的

1 char *p2 = "lmj";

2 *p2 = ‘L‘;

3

4 printf("%s", p2);

看起来似乎是可行的,但这是错误代码,错在第2行。首先看第1行,指针变量p2指向的是一块字符串常量,正因为是常量,所以它内部的字符是不允许修改的。

有人可能搞蒙了,这里的第1行代码char *p2 = "lmj";跟第一种方案中的第2行代码char a[] = "lmj";不是一样的么?这是不一样的。

·       char a[] = "lmj";定义的是一个字符串变量!

·       char *p2 = "lmj";定义的是一个字符串常量!

黑马程序员—08-指针