C语言指针学习总结

指针

指针的重要性

表示一些复杂的数据结构
快速的传递数据
使函数返回一个以上的值
能直接访问硬件
能够方便地处理字符串
是理解面向对象语言中引用的基础

总结:指针是C语言的灵魂

指针的定义

地址
内存单元的编号
从0开始的非负整数
范围:0—4G-1(232=230+2^2=4G)
指针
指针变量就是存放内存单元编号/存放地址的变量
指针就是地址,地址就是指针
地址就是内存单元的编号
指针变量是存放地址的变量
指针和指针变量是两个不同的概念,但通常会把指针变量简称为指针,实际含义不同
指针的本质就是一个操作受限的非负整数

指针的分类

1.基本类型指针[重点]

p保存i的地址
p指向i
*p等同于i
1.1经典指针程序——互换两个数字

#include
void swap1(int *, int * );
void swap2( int , int );
void swap3(int *, int * );

int main(void)
{
	int a = 3;
	int b = 5;
	swap1(&a , &b); 	//因为p和q只能接受整型变量的地址,所以取&
	swap2(a, b);	//error
	swap3(&a, &b);	//error
	printf("a = %d , b = %d" , a, b);
	return 0;
}
void swap1(int * p, int * q)   //形参名字是p和q,接受实参数据的是p和q
{
	int t;
	t = *p;
	*p = *q;
	*q = t;
}
void swap2( int a, int b)
{
	int t;
	t = a;
	a = b;
	b = t;
}
void swap3(int * p, int * q)
{
	int * t;
	t = p;
	p = q;
	q = t;
}
附注

1.1.1*的三种含义
1. 乘法
2. 定义指针变量
int * p; //定义了一个叫p的变量,int 表示p只能存放int变量的地址
3. 指针运算符
该运算符放在已经定义好的指针变量的前面
如果p是一个已经定义好的指针变量
p表示 以p的内容为地址的变量
1.1.2.如何通过被调函数修改主调函数普通变量的值
1.形参必须为指针变量
2.实参为该普通变量的地址
3.被调函数中通过
*形参名
的方式来修改

2.指针和数组

2.1指针和一维数组

2.1.1一维数组名
一维数组名是个指针常量
它存放的是一维数组第一个元素的地址
2.1.2下标和指针的关系
如果p是个指针变量,则
p[i]永远等价于*(p+i)

2.1.3指针变量的运算

2.2指针和二维数组

3.指针和函数

4.指针和结构体

5.多级指针

#include

int main(void)
{#include<stdio.h>

int main(void)
{
	int * p;//p是变量的名字,int *表示p变量存放的是int类型变量的地址
	int i = 3;
	p = &i; //OK
	p = i;  //error  因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量的值
	p = 55; //error 原因同上

	return 0;
}
	int * p;//p是变量的名字,int *表示p变量存放的是int类型变量的地址
	int i = 3;
	p = &i; //OK
	p = i;  //error  因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量的值
	p = 55; //error 原因同上

	return 0;
}
#include

int main(void)
{
	int * p;//p是变量的名字,int *表示p变量存放的是int类型变量的地址
			// int * p不表示定义了一个名字叫做*p的变量
			//int * p应该理解为:p是变量名,p变量的数据类型是int *类型
			//		所谓int * 类型实际就是存放int变量地址的类型
	int i = 3;
	p = &i; 
			/*
				1.p保存了i的地址,因此p指向i
				2.p不是i,i也不是p,更准确地说,修改p的值不影响i的值,修改i的值也不会影响p的值
				3.指针和地址含义相同
				4.如果一个指针变量指向了某个普通变量,则
					*指针变量 就完全等同于 普通变量
				  例子:
				  		如果p是个指针变量,并且p存放了普通变量i的地址
				  		则p指向了普通变量i
				  		*p 就完全等同于 i
				  		或者说:在所有出现*p的地方都可以替换成i
				  				在所有出现i的地方都可以替换成*p
				  		*p就是以p的内容为地址的变量
			*/

	return 0;
}

常见问题

#include

int main(void)
{
	int * p;
	int i = 5;
	*p = i;		//系统只开辟了i和p两个变量的空间,*p所指空间为未知空间,系统自动拦截这种错误。(当前p未赋值,所以其为垃圾值,*p表示指向以垃圾值为地址的内容)
	printf("%d/n", *p);
	return 0;
}
#include

int main(void)
{
	int i = 5;
	int * p;
	int * q;
	
	p = &i;
	//*q = p;	//error 语法编译会出错  *q:int型   p:int * 型
 	//*q = *p;  //error 
	p = q;
	printf("%d/n", *q);  //野指针
	return 0; 
}

你可能感兴趣的:(指针,c语言)