热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C语言指针总结之程序举例分析

一、指针变量未初始化int*p;*p10;因为,第一句只是声明了一个指针变量p,并没有为其赋值(没有为指针变量p开辟空间࿰

一、指针变量未初始化

int *p;

*p = 10;

因为,第一句只是声明了一个指针变量p,并没有为其赋值(没有为指针变量p开辟空间)。而,第二句的意思是说,以p的内容为地址,将10赋给它。可以改成下面,

int *p = (int *)malloc(sizeof(int));

*p = 10;

或者

int *p;

int a = 10;

p = &a;为什么不能写成*p = a;

p = &a;意思是,将a的地址赋值给p;(如果,*p或者是a的值改变,那么*p和a都会变,其实*p就是a,所以他们两个的值会保持一致)

*p = a;意思是,以p的内容为地址,将变量a的值赋给它。但是,并没有为p开辟空间,所以导致报错。(这种赋值,两个不会一起变,你改变谁,谁就会变)

二、char*字符串操作

1、先说一下malloc和calloc的区别,两个都是用来开辟动态内存空间的。malloc开辟的空间,里面的内容不会初始化,也就是说,malloc里面开辟的空间里面存放的都是垃圾数据。calloc开辟的空间,会初始化。我刚开始在使用strlen来计算char *的长度的时候, strlen是以'\0'字符作为结束的。所以,在用strlen来计算malloc开辟的char *的长度的时候,得到的结果是不准确的。

2、两个char *类型变量之间的赋值

char * a = "abcdefg";

char* b = (char *)malloc(strlen(a));

第一种赋值方式:b = a;这种赋值方式的意思是,把a的首地址给b,两个指向的并不是同一个字符。a和b不会同时改变,这里要注意一个问题,不要误以为char *类型的就是地址,其实不是的,如果要取地址的话,还是要写成&a;

第二种赋值方式:

int i = 0;

while(*a){

*(b+i++) = *(a++);或者b[i++]=*(a++);//执行完之后,a的指针指向了,字符串的结尾

}

*(b+i)='\0';//为了避免,b中出现乱码的情况,'\0'表示字符串的结束符

为什么不能使用:*(b++) = *(a++);//因为,没执行一次指针a、b都会忘后移动一位,最后,两个指针都会执行结尾。

b = a + 2;//指b等于指针a向后面移动两位,执行完之后,b = "cdefg";

三跨函数使用内存

1、通过调用test函数来改变q的值,通过指针的地址在函数之间的传递

void test(int **p){
*p = (int *)malloc(sizeof(int));//在这里其实也是在初始化指针变量q
**p = 2;//p和q指向的是同一个变量
}
int main(){
int *q;
test(&q);//将q的地址传给p
}

2、

void test(int *p){
*p = 2;
}
int main(){
int *q = (int *)malloc(sizeof(int));//这里必须初始化q
test(q);//将q的内容传给指针变量p
}

3、

void test(int **p){
*p = (int *)malloc(sizeof(int));//在这里其实也是在初始化指针变量q
**p = 2;//p和q指向的是同一个变量

free(*p);//释放,指针变量*p所指向的变量,通过传地址,可以跨函数使用变量
}
int main(){
int *q;
test(&q);//将q的地址传给p,这里将得到一个垃圾值(负数)
}


推荐阅读
  • 本文介绍了基于c语言的mcs51单片机定时器计数器的应用教程,包括定时器的设置和计数方法,以及中断函数的使用。同时介绍了定时器应用的举例,包括定时器中断函数的编写和频率值的计算方法。主函数中设置了T0模式和T1计数的初值,并开启了T0和T1的中断,最后启动了CPU中断。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了在Windows系统上使用C语言命令行参数启动程序并传递参数的方法,包括接收参数程序的代码和bat文件的编写方法,同时给出了程序运行的结果。 ... [详细]
  • C语言判断正整数能否被整除的程序
    本文介绍了使用C语言编写的判断正整数能否被整除的程序,包括输入一个三位正整数,判断是否能被3整除且至少包含数字3的方法。同时还介绍了使用qsort函数进行快速排序的算法。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了汉诺塔问题的迭代算法实现,通过递归的方式将盘子从一个地方搬到另一个地方,并打印出移动的顺序。详细介绍了算法的思路和步骤,以及示例代码的运行结果。 ... [详细]
  • OO第一单元自白:简单多项式导函数的设计与bug分析
    本文介绍了作者在学习OO的第一次作业中所遇到的问题及其解决方案。作者通过建立Multinomial和Monomial两个类来实现多项式和单项式,并通过append方法将单项式组合为多项式,并在此过程中合并同类项。作者还介绍了单项式和多项式的求导方法,并解释了如何利用正则表达式提取各个单项式并进行求导。同时,作者还对自己在输入合法性判断上的不足进行了bug分析,指出了自己在处理指数情况时出现的问题,并总结了被hack的原因。 ... [详细]
  • C语言常量与变量的深入理解及其影响
    本文深入讲解了C语言中常量与变量的概念及其深入实质,强调了对常量和变量的理解对于学习指针等后续内容的重要性。详细介绍了常量的分类和特点,以及变量的定义和分类。同时指出了常量和变量在程序中的作用及其对内存空间的影响,类似于const关键字的只读属性。此外,还提及了常量和变量在实际应用中可能出现的问题,如段错误和野指针。 ... [详细]
  • 《2017年3月全国计算机等级考试二级C语言上机题库完全版》由会员分享,可在线阅读,更多相关《2017年3月全国计算机等级考试二级C语言上机题库完全版( ... [详细]
author-avatar
血狼2732_150
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有