C语言零基础入门-指针-05
本节要点:
1,字符指针。
2,字符串指针。
3,指针的参数传递
4,多重指针
01. 字符指针
这里的定义与前面的基本一样,所谓的字符指针就是这个指针指向的是一个字符型的变量。
01.1 单个字符
代码如下:
#include#include<stdio.h>void main(){char a = 'A';char *p = &a;printf("%c ",*p);
}
- 首先定义了一个字符型变量a。
- 由于指针p将要指向的变量的字符类型的,所以指针变量p定义的时候前面的数据类型也是char。
02. 字符串指针
单个字符的指针与之前定义的int,float类似,都是一个数据。接下来说一下字符串的指针。
02.1 字符串定义的回顾
在学数据类型的时候我说过,C语言中没有字符串,但是C语言的字符串可以使用数组模拟出来(并且C语言中提供了格式控制符 %s 来进行字符串的输出)
方法1:
#include<stdio.h>void main(){char str[] = {'1','2','3','4','5','0'};printf("%sn",str);printf("%cn",str[3]);
}
这种方式就是我们最常用的数组定义形式(至于为什么这种定义方法后面要加 0 可以去数组章节看看回顾一下)。
方法2:
这种方法其实原理与1一样,只不过是这种方法比较简写,但是他的内部原理还是用数组存放每一个元素。
#include<stdio.h>void main(){char str[] = "I LOVE CHINA!";printf("%sn",str);printf("%cn",str[3]);
}
- 首先定义了一个字符类型的数组str。
- 然后使用 %s 就可以输出整个字符串了。
- 同样由于这个字符串是使用数组模拟出来的,因此也可以使用数组的索引方式,用%c作为输出的格式控制来输出数组元素。
02.2 字符串指针
讲函数的时候我们说过,把数组当作参数传递的时候直接传递数组名就可以了,这是因为数组定义之后,数组名代表的就是整个数组的首地址。
具体使用看下边的代码:
#include<stdio.h>void main(){char str[] = "I LOVE CHINA!";char *p = &str[0];printf("%sn",p);printf("%cn",p[3]);
}
需要注意一点的就是:对于字符串的数据的输出,前面不用加 *
。
其实这个就是个特殊规定,大家记住就好,因为很多常用的东西都会赋予许许多多的特殊规定的。
- 首先定义了一个字符串str。
- 然后让指针变量指向str的首地址。
- 然后,直接把指针变量当作数组名来使用就可以了。
03. 指针的参数传递
03.1
如果我们在main中把一个数据a传入子函数,然后在子函数中修改这个数据,大家应该能想到,main函数中的数据a是不会变的。程序如下:
#include<stdio.h>void change(char p){p = '6';
}
void main(){char a = 'Y';printf("%cn",a);change(a);printf("%cn",a);
}
结果:
分析:
- 因为当实参a作为参数传递的时候,形式参数p其实接收到的是a的数据而已(即相当于把a的数据拷贝一份给p了)。
- 所以当我们修改p的数据的时候,只是修改了p本身的数据,而与a无关。
下边我就演示一下怎样使用指针的知识,在函数之间进行参数的传递。
03.2 单个数据的传递
程序:
#include<stdio.h>void change(int *p){*p = 9;
}void main(){int a = 6;int *p = &a;printf("%dn",a);change(p);printf("%dn",a);
}
结果:
分析:
内存分析:
- 直接把数据a的地址传给子函数,然后子函数根据传入的地址进行修改地址中的数据。
03.3 数组数据的传递
与单个数据的传递类似,数组也是传入地址,然后在子函数中修改某个地址上的数据,就可以达到修改这个数组中的内容的效果。
程序:
#include<stdio.h>void change(char *p){p[3] = '6';
}void main(){char str[] = "I LOVE CHINA!";char *p = &str[0];printf("%sn",p);change(p);printf("%sn",p);
}
结果:
分析:
- 将数组str的首地址传入子函数。
- 子函数接收到的地址存放在指针变量p中。
- 然后就可以把p当作数组操作了。
04. 多重指针
多重指针的使用情况较少,并且挺难的,所以这里讲的目的是让大家了解一下有这么个东西就好了。
程序:
#include<stdio.h>
void main(){int a = 6;printf(" a: %dn",a);printf(" &a: %dn",&a);printf("n");int *p1 = &a;printf(" p1: %dn",p1);printf(" &p1: %dn",&p1);printf("n");int **p2 = &p1;printf(" p2: %dn",p2);printf(" &p2: %dn",&p2);printf("n");int ***p3 = &p2;printf(" p3: %dn",p3);printf(" &p3: %dn",&p3);printf("n");int ****p4 = &p3;printf(" p4: %dn",p4);printf(" &p4: %dn",&p4);printf("n");printf(" ****p4: %dn",****p4);
}
结果:
分析:
地址分析:
- 于是,
*p4
到p3的值。*p3
得到p2的值。*p2
到p1的值。*p1
到a的值。 - 于是
****p4
便得到了a的值6。
05. 结束
到目前位置,基本上指针的重要知识点就结束了,其他的一些书本上的知识点,基本上不会怎么用(除非你要搞逆向)。
等到用到的时候,我会在说(但是基本没啥了)。
老规矩,下一节布置习题。