《黑马程序员》 ★指针练习★ (C语言)

时间:2022-06-01 16:51:49

指针的基本概念:

重要性:

如果你说C语言中除了指针,其他你都学得很好,那你干脆说没学过C语言。-----引用李明杰老师的一句话

格式:

变量类型  * 变量名            例:int *p;   作用:能够根据1个地址值访问并修改对对应的存储空间

使用:

代码联系1

#include <stdio.h>
int main()
{
  int a = 80;              //定义一个整形变量a且赋值80;
  int *p;                  //定义一个int型指针变量*p
  p = &a;                  //取得变量a的地址并且赋给指针p
  *p = 10;                 //对p所指向的存储空间(也就是a)赋值
  printf("a = %d",a);      //输出变量a的值
  return 0;
}
运行结果:a = 10

 int *p中的*是指针的标志

p = &a;    指针变量只能存储地址   

int *p;     指针变量p前面定义了int,说明指针只能指向int 型数据

代码练习2

 

#include <stdio.h>
//通过使用指针改变变量a的值
int change(int *n)
{
  *n = 10;                    //对n所指向的存储空间(也就是a)赋值
}

int main()
{
  int a = 80;                //定义一个整形变量a且赋值80;
  change(&a);                //调用change函数,把变量a的地址送给change函数的形参
  printf("a = %d",a);        //输出变量a的值
  return 0;
}

运行结果:a = 10

注:如果不利用指针则无法在change函数内修改main函数中变量a的值

 使用注意:

int main()
{
	int *p;
	double d = 3.2;
	p = &d;                    // 错误原因:int *p只能指向int类型的数据

	int *p;
	p = 200;                   //错误原因:指针变量只能存储地址

	int *p;
	printf("%d\n",*p);         //指针变量未经初始化,不能直接访问其他的存储空间

	int *p;
	*p = &a;                   //错误写法
}

指向指针的指针:

int main()
{
       int a = 20;               //定义并向a赋值
       int *p = &a;              //取得a的值并赋给指针p 
       int **pp = &p;            //取得p的值并赋给指针pp
       **pp = 30;                //对指针pp所指向的存储空间赋值
       printf("a = %d\n",**pp);  //输出变量a的值
       return 0;
}
运行结果:a = 30

注:指针在任何类型下都是占用8个字节

二、指针和数组

1.数组的访问方式:

数组名【下标】           例:ages[i];

指针变量名【下标】     例:p[i];  //前提是指针变量P指向数组

例:int ages[3] = {41,52,95};

     int *p;

     p = ages;     // 数组名就是数组首元素的地址,此行代码表示把数组元素地址赋给指针p   

使用指针遍历数组内各元素:

2.指针变量的+1究竟地址会加几取决于指针变量的类型

int *p                p+1相当于地址值+4;

char *p             p+1相当于地址值+1;

double *p          p+1相当于地址值+8;

int main()
{
int ages[5] = {10,8,91,64,7}; int *p; p = &ages[0]; for(int i = 0;i <= 4;i++) { printf("ages[%d] = %d\n",i,*(p+i)); } return 0; }
运行结果:
ages[0] = 10
ages[1] = 8
ages[2] = 91
ages[3] = 64
ages[4] = 7

 解析:指针p指向ages[0]    p+1则指向ages[1]

  三、指针与字符串  

定义字符串的方式: 

 

char s[] = "itcast";

char *s = "itcast"       指针s指向字符串的首元素地址

char *s;

*s ="itcast" 

        char *buf = "it";//指针变量buf指向了字符串的首地址
	printf("*buf = %c\n",*buf);
	printf("buf = %s\n",buf);//

 运行结果: buf =i                 

                buf =it             %s遇到\0才会停止

返回指针的函数:

类型名 函数名(参数列表)

char *test();      代表函数返回char类型的数据

#include <stdio.h>
char *test();                             //函数声明
int main()
{
	char *name =test();              //定义一个字符串并且调用指针函数
	printf("name = %s\n",name);      //输出字符串name内元素
	return 0; 
}
char *test()
{
	return "rose";
}

  

指向函数的指针:

函数的返回值类型 (*指针变量名)(形参1, 形参2, ...);

#include <stdio.h>
void test();
int main()
{
	//(*p)是固定写法,代表指针变量p将来肯定指向函数
	//左边的void ,代表变量p指向的函数没有函数值
	//右边的():指针变量p指向的函数没有形参
	void (*p)();
	//指针变量p指向了test函数
	p = test;     //把函数覅只赋给指针p
	(*p)();       //简介调用函数test 
	test();       //直接调用函数test
	p();

	return 0;
}
void test()
{
	return "rose";
}