C语言 —— 指针专题(2)

一、字符指针 以及 字符串

  • 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语言,本篇只能把指针的一些基本知识点陈列了一下,主要的还是 这些知识点后大量的题目实例的练习,把指针练成一种本能,加油!!!!!!!!!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值