C语言入门之指针(4)
-
指针的小结
- 首先要准确地弄清楚指针的含义。指针就是地址,凡是出现“指针”的地方,都可以用“地址”代替,例如,变量的指针就是变量的地址,指针变量就是地址变量
- 要区别指针和指针变量。指针就是地址本身,而指针变量是用来存放地址的变量。
void *指针是一种特殊的指针,不指向任何类型的数据,如果需要用此地址指向某类型的数据,应先对地址进行类型转换。可以在程序中进行显式的类型转换,也可以由编译系统自动进行隐式转换。无论用哪种转换,读者必须了解要进行类型转换
3.要深入掌握在对数组的操作中怎样正确地使用指针,搞清楚指针的指向。一维数组名代表数组首元素的地址
int *p,a[10];
p=a;
p是指向int类型的指针变量,p只能指向数组中的元素,而不是指向整个数组。在进行赋值时一定要先确定赋值号两侧的类型是否相同,是否允许赋值。
对“p=a;”,准确地说应该是:p指向a数组的首元素
4.指针运算
(1)指针变量加(减)一个整数
例如:p++,p--,p+i,p-i,p+=i,p-=i等均是指针变量加(减)一个整数。
将该指针变量的原值(是一个地址)和它指向的变量所占用的存储单元的字节数相加(减)。
(2)指针变量赋值
- 将一个变量地址赋给一个指针变量
- 不应把一个整数赋给指针变量
(3) 两个指针变量可以相减
如果两个指针变量都指向同一个数组中的元素,则两个指针变量值之差是两个指针之间的元素个数
(4) 两个指针变量比较
- 若两个指针指向同一个数组的元素,则可以进行比较
- 指向前面的元素的指针变量“小于”指向后面元素的指针变量
- 如果p1和p2不指向同一数组则比较无意义
(5) 指针变量可以有空值,即该指针变量不指向任何变量,可以这样表示:
p=NULL;
5.指针为NULL时不能引用,引用将会出现
漰溃,例如: char *p = NULL;
char a = *p;
-
指针加1或减1,所指向的地址移动的大小与指向的对象有关。
1.字符指针加1或减1,将移动1个字节的地址
2.短整型指针加1或减1,将移动2个字节的地址
3.整型,长整型,单精度浮点型指针加1或减1,将移动4个字节的地址
4.双精度浮点型指针加1或减1,将移动8个字节的地址
5.其它自定义数指针加1或减1,将移动一个自定义数据长度的地址
解决办法:三步曲
1、定义指针时,把指针变量赋值成NULL
2、释放内存是,先判断指针变量是否为NULL
3、释放完内存后,把指针变量重新复制成NULL
-
函数调用的时候,这个场景修改不了实参
int FreeMem1(char *p)
{
if (p == NULL)
return -1;
if (p != NULL)
{
free(p);
p =NULL;//只是把形参重置为NULL,但是实参并没有改变
}
return 0;
}
解决FreeMem1释放空间指针不能重置问题
int FreeMem2(char **p) { //实参地址传过来了
if (*p == NULL)
return -1;
if (*p != NULL) {
free(*p);
*p =NULL;//把实参重置为NULL,不会产生野指针
}
return 0;
}
常量指针和指针常量
- const int * p1; //指向的对象是常量
- int const *p2; //指针本身是常量
- const int const *p3; //指针本身是
//常量且指向的对象是常量
*p1=8;//错误 p1++; //正确
*P2 = 8;//正确 p2++; //错误
*P3 = 8;//错误 p3++; //错误
指针数组和数组指针
- int *p1[4]; //是一个数组,有4个指针元素
- int (*p2)[4]; //是一个指针,指向一个有4个元素的一维数组
指向指针的指针
int a = 10; int *p3 = &a;
int **p4 = &p3; //是一个二维指针,指向另一个指针p3
函数指针
例如:
int *(*func)(int (*f)(int *x,int *y));
函数类型为:int*
函数指针名为:func
函数指针的参数是另一个函数指针int (*f)(int *x,int *y)
相关文章
- Linux下C语言实现简单的套接字编程
- C语言编程基础入门经典100题(1-10)-简书_c语言简单代码
- C语言入门经典书籍_C语言从入门到精通
- C语言字符串从入门到进阶指南
- C语言之——入门必刷题(3)
- 开发Linux下强劲C语言软件开发实战(linuxc语言软件)
- C语言复合语句(语句块)
- C语言入门书籍推荐,小白自学经典(免费下载)
- 掌握Linux C语言时间函数的基本使用(linuxc时间函数)
- Linux C语言程序设计入门(linuxc程序设计基础)
- Linux C语言实践:从入门到精通(linuxc实战)
- 开发Linux下C语言程序开发入门(linuxc语言程序)
- Linux下学习C语言编程:从入门到精通(linux编写c语言程序)
- Linux下使用C语言编程入门(linuxc语言中文)
- C语言操作MySQL数据库入门实践(c引用mysql)
- Linux下C语言编程入门
- Linux C语言工程文件编写入门指南(linux c 工程文件)
- MySQL环境下C语言访问端口号指南(c mysql 端口号)
- C语言和MYSQL深度数据清理技术(c mysql清理)
- 新手学习C语言从MySQL新增实例入门(c mysql 新增)
- 掌握利器从入门到精通的C语言与MySQL(c mysql怎么使用)
- MySQL实战C语言编程技巧(c mysql实战)
- C语言和MySQL结合从入门到精通(c mysql使用教程)
- C语言编程与Oracle数据库交互实例(c oracle编程示例)
- C语言与Oracle数据库环境搭建免费下载指南(c oracle 下载)
- C语言入门之指针用法教程