一、字符指针 以及 字符串
- C语言通过使用字符数组 来 处理 字符串 。
- 通常,我们把char 数据类型的指针变量称为字符指针变量, 字符指针变量与数组变量有着密切的关系,他也被用来处理字符串。
- 初始化字符指针,是把字符串的首地址赋予该字符指针,不是把整个字符串赋值到该字符指针中。
- 在C编程中,当字符指针指向一个字符串常量时,不能修改指针指向的对象 的值。
char * a = "zhoubofen" ; *a = 'a' ---- 是错误的; 不能修改。
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
char a[] = "zh";
char * p ;
char * q = "eg"; //字符指针q指向了一个字符串常量
printf("%s \r\n",q);
p = a;//将字符指针指向 字符串a
*p = 'a'; //将字符串a中的第一个字符改为 a
printf("%s \r\n",q); //打印字符指针q指向的字符串
printf("%d \r\n",strlen(p)); //打印 字符指针p指向的字符串的长度
printf("%s \r\n",p);//打印字符指针p指向的字符串
return 0;
}
输出的结果 : eg eg 2 ah
- 例如 : cha * p = "zhoubofeng"; char * q = ''zhoubofeng"; ----- 由于p与q指向一个相同的字符串常量,从内存管理的角度,p与q中保存的地址(指向的位置)是同一个,也就是说打印出来的地址是一样。
二、指针数组
- 指针数组 是指由 若干个具有相同 存储类型 和 数据类型 的指针变量构成的集合。
指针数组的一般形式 :<存储类型> <数据类型> * <指针变量名>[<大小>]
指针数组名表示 该指针数组的 起始地址。
#include <stdio.h>
#include <string.h>
int main(int argc, const char *argv[])
{
int a[2][3] = {{1,2,4},{5,6,7}};
int *p[2];
int i =0 ;
p[1] = a[0]; //二维数组 行地址 放入指针数组的第一个元素中
p[0] = a[1];
for(i=0;i<3;i++)
printf("%p %d \r\n",p[0]+i,*(p[0]+i));
for(i=0;i<3;i++)
printf("%p %d \r\n",p[1]+i,*(p[1]+i));
return 0;
}
输出:0xbfedce24 5
0xbfedce28 6
0xbfedce2c 7
0xbfedce18 1
0xbfedce1c 2
0xbfedce20 4
结论:指针数组中存放的 是地址,数组的每一个元素都是一个指针变量。
二维数组 可以看作由多个一维数组构成,可直接将二维数组的行地址 a 以及列地址 a [0] 直接放入指针数组中。
例子 : int *p[2] ; int a[3] ; p+1 指向了 p[1] ; 如果 p [1] = a ; 则 *(p+1)+2 与 p[1] +2 都指向 a[2] ;
题目 : 使用 指针数组 将 求二维数组 中所有的元素的 和。
1、如何计算指针数组占的空间。-------- int * q[3] sizeof(q) == 12 Bety;
2、指针数组名加一,移动多少字节。 ------------------- 指针 数组中放的都是指针(地址),则移动的都是4个字节。
3、指针数组名相当于一个什么样的指针。 -------------- 例如 int *p[2] ; int * *q ; q = p ;
三、 多级指针
- 定义 : 把一个 指向指针变量 的 指针变量,称为 多级指针。
对于指向处理数据 的指针变量,称为一级指针变量,简称一级指针。
而把指向一级指针变量 的指针变量,称为二级指针变量,简称二级指针。
- 二级指针形式 :<存储类型> <数据类型> ** <变量名>
例如 : int *q ; int ** p ; p = &q ; int m = 10 ; q = &m;
q存放的变量m的地址,*p指向变量m的数据;p存放 指针变量q 的地址,*p指向 指针变量q的数据,q中的数据是变量m的地址,则**p指向变量m的数据。
- 二级指针加1 会移动多少个字节 : 二级指针加1 移动一个目标,二级指针的目标为一级指针,也就是说加1移动一个一级指针,就是移动了4个字节。
注 : 多级指针 篇幅放的不多,但绝对是不是因为简单,主要是作为基础,重在了解,刚接触时用的确实不多,而且大多可以用一级指针代替。
四、void 指针 一级 const
1、void 指针
- 定义 :void 指针是一种没有确定数据类型的 指针变量,它可以通过强制类型转换让该变量指向任何一种数据类型变量。
一般形式 : void * <指针变量名称>
- void 指针 在没有进行强制转黄之前, 不能进行 算术运算 --- 测试:void指针没强制转换直接运算,地址增加的没有规律。
- 使用void 指针的场景 :内存管理时 的malloc() 函数,创建线程 ;快速排序时 也会使用到该指针。
题目 :利用Void 指针来遍历一维数组。
#include <stdio.h>
int main(int argc, const char *argv[])
{
int a[] = {1,2,4,5,6};
void * p ;
int n = 0;
int i = 0;
p = (void*)a ;
n = sizeof(a)/sizeof(int);
while(i<n)
{
for(i=0 ;i <n ; i++)
printf("%d ",*((int*)p+i));
puts("");
}
return 0;
}
2、const 变量
- const 修饰变量
作用 :常量化变量的值。
一般形式 : const <数据类型> 变量名 = [<表达式>]
- const 修饰指针
i、 常量话指针目标表达式 : const <数据类型> * <指针变量名称> [= <指针变量表达式>]
常量话指针目标 是限制 通过指针改变其目标的数值,但<指针变量>储存的地址值可以修改。
例如 : const int* p ; *p不能修改,但是p可以改。
ii、常量化指针变量 :<数据类型> *const <指针变量名称> [= <指针变量表达式>]
例如 : int m ; int* const p = &m ; p不能修改,但是*p可以改。
const修饰 : 修饰的谁,那么谁将不能够更改。
后语 : 指针 称之为 C语言的灵魂,没有把指针学好,没有人会相信你掌握了C语言,本篇只能把指针的一些基本知识点陈列了一下,主要的还是 这些知识点后大量的题目实例的练习,把指针练成一种本能,加油!!!!!!!!!!!!