为什么写这篇文章 在上周六,我在公众号里发了一篇文章:C语言指针-从底层原理到花式技巧,用图文和代码帮你讲解透彻,以直白的语言、一目了然的图片来解释指针的底层逻辑,有一位小伙伴对文中的代码进行测试,发现一个比较奇怪的问题...期望结果 根据上篇文章的讨论,我们知道: s 是一个包含 3 个元素数组,每个元素的类型是结构体 Student; p 是一个指针,它指向变量s,也就是说指针 p 中保存的是变量 s 的地址,因为数组名就表示该数组的首地址...警告信息说:printf 语句需要 int 型数据,但是传递了一个 Student 结构体类型,我们先不用理会这个警告,因为我们就是想通过指针来访问这个地址里的数据。...这就说明 printf 语句在执行时没有改变指针变量的指向地址。 3.2 打印一个结构体变量 既然在字符串上测试没有问题,那么问题就出在结构体类型上了。...0x01020300,然后强转成 char* 类型,再然后加上 num 占据的字节数(4个字节),得到地址 0x01020304,最后把这个地址赋值给 arg,因此 arg 这个指针就指向了栈中数字
C语言指针的总结 1. 变量 不同类型的变量在内存中占据不同的字节空间。 内存中存储数据的最小基本单位是字节,每一个字节都有一个内存地址,这个地址是一个十六进制的数。...下面通过一张图可以更直观的理解内存中的地址 ? 内存中的地址演示图 2. 指针 指针是C语言的灵魂。指针变量占据8个字节。 变量在内存中的存储。 变量的值:存储在变量中的数据,叫做变量的值。...for(int i = 0; i < 7; i++) { printf("%d\n",*(p1+i)); } 2). 使用指针遍历数组的第二种方式....printf("%d\n", pMaxValue(5,10)); // 通过指针调用函数方法1 printf("%d\n",(*pMaxValue)(6,9)); // 通过指针调用函数方法...2 printf("%d\n",MaxValue(9, 13)); // 调用函数 printf("%p\n",MaxValue); // 输出函数的地址 return
大家好,又见面了,我是你们的朋友全栈君。 1、控制小数点后有多少位:printf(“%.10lf\n”,f_a); //将浮点数f_a输出时,输出其小数点后10位,默认是输出小数点后6位。...3、输出时让正数带”+”号,负数带”-“号:printf(“%+f\n”,f_c); //输出f_c时,若f_c是正数,则在其前面加”+”号,否在,在其前加”-“号。...如: double d=123456789.12345; printf("%10.2lf",d); 以上两条语句的输出结果是:123456789.12,而不是3456789.12. 6、printf()...中的’\r’表示把cursor移动到本行首,‘\n’表示移动到下一行(并没有包含移动到行首的意思),但在C语言中’\r’被识别成ctrl+M,’\n’被解释成移动到行首再换行。...8、printf()、%p输出地址 int* p; p=(int*)malloc(1234); printf("pointer=%p\n",p); free(p); 说明:以上代码输出地址变量p的值。
C++指针变量作函数参数接收数组地址 在C++中,用指针变量指向数组元素时要注意: 指针变量p可以指向有效的数组元素,实际上也可以指向数组 以后的内存单元。...在上一节小林已经讲过:数组名代表数组首元素的地址,用数组名作函数的参数,传递的是数组首元素的地址,同样用指针变量作函数形参, 也可以接收从实参传递来的数组首元素的地址。 ...在C++实际中,函数调用时并不存在一个占有存储空间的形参数组,只有指针变量。...而形参数组名是指针变量,并不是一个固定的地址值,它的值是可以改变的。...在函数调用开始时,它接收了实参数组首元素的地址,但在函数执行期间,它可以再被赋值。 8.2 C++指针变量作函数参数接收数组地址 更多案例可以go公众号:C语言入门到精通
相比于其它的编程语言,C语言的输入输出功能非常强大,可以按照各种要求进行输入输出。 printf() 的功能主要用于按照用户指定的格式把指定的数据输出到显示器上。...1. printf()的常用的格式字符 2. printf()常用的附加格式 3. printf()常用的输出格式 scanf() 的功能主要从键盘按照规定的格式读取若干个数据。...1. scanf()的常用的格式字符 2. scanf()常用的附加格式 3. scanf()常用的输入格式
相比于其它的编程语言,C语言的输入输出功能非常强大,可以按照各种要求进行输入输出。 1. printf 的功能 主要用于按照用户指定的格式把指定的数据输出到显示器上。...1.1. printf 的常用的格式字符; 1.2. printf 常用的附加格式; 1.3. printf 常用的输出格式; 2. scanf 的功能 主要从键盘按照规定的格式读取若干个数据...2.1. scanf 的常用的格式字符; 2.2. scanf 常用的附加格式; 2.3. scanf 常用的输入格式;
printf("%p\n", &a);//000000B633B8FBE4 以16进制的形式输出 //只输出起始(低)位置,后面的地址依次加1; //&取出地址操作符 int* pa =...,指针变量并不完全等同指针, 但口头上 指针 一般是 指针变量 2.1指针变量的大小 1.指针变量是专门用来存放地址的,指针变量的大小取决于一个地址存放需要多大空间 32位机器上:地址线32根,地址的二进制序列就是...野指针是C语言中一个常见的内存泄漏问题。如果程序中存在野指针,当程序再次申请内存时,可能会将之前已经释放的内存分配给新的变量,导致程序出现不可预测的行为,甚至崩溃。 野指针成因: 1....NULL 是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。...使用空指针进行解引用操作会导致程序崩溃,因为没有任何有效的内存地址可供访问。在C语言中,空指针主要用于表示指针变量没有指向任何有效的内存地址,例如未初始化的指针变量或已释放的内存块。
在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。 那么如何学习呢?当然是每天都练习一道C语言题目!! ? 作者 闫小林 白天搬砖,晚上做梦。...例82:C语言用指向指针的指针的方法对n个整数排序并输出;要求将排序单独写成一个函数;n个整数在主函数中输入,最后在主函数中输出。...解题思路:读者看着道题的时候,首先要观察一下有什么规律,然后指向指针的指针在上一道练习题中已经有了铺垫,读者可以联系上一道题去熟练使用指向指针的指针。...,&number);//键盘输入 for(i=0;i<number;i++) { pstr[i]=&data[i]; //将第i个整数的地址赋予指针数组pstr的第i个元素 }...:\n");//提示语句 for(i=0;i<number;i++) { printf("%d ",*pstr[i]);//输出排序后的结果 } printf("\n");//
展示一下使用指针的指针和指针的引用修改传递给方法的指针,以便更好的使用它。...(这里说的指针的指针不是一个二维数组) 为什么需要使用它们 当我们把一个指针做为参数传一个方法时,其实是把指针的复本传递给了方法,也可以说传递指针是指针的值传递。...如果我们在方法内部修改指针会出现问题,在方法里做修改只是修改的指针的copy而不是指针本身,原来的指针还保留着原来 的值。...输出的是两个2 使用指针的指针 展示一下使用指针的指针做为参数 void func(int **p) { *p = &m_value; // 也可以根据你的需求分配内存 *p...我们看一下 func(int **p)这个方法 p: 是一个指针的指针,在这里我们不会去对它做修改,否则会丢失这个指针指向的指针地址 *p: 是被指向的指针,是一个地址。
1 从一个报错讲起 在上一篇文章中,我们使用了 C 语言在屏幕中输出了"Hello World!",但就printf这个函数而言,它的使用却不只是这么简单。...在使用 gcc 进行编译的时候会出现如下的报错 ? 这个问题是因为printf的用法不符合要求,那正确的用法是什么样的呢?...2 printf 函数 printf 函数用于打印格式化字符串到标准输出流,其函数原型为 ?...在 C 语言中,用双引号括起来的内容称之为字符串,即平时所说的文本。字符串可以由可见字符和转义字符组成,像上面所示的那条鱼的主要组成部分——星号(*),就是可见字符。...但反斜杠如果后边不带任何字符(直接换行),表示我们希望 C 语言将该行以及下一行看做是一个整体。 所以为了打印输出一条鱼,我们要将\n和\一起使用,具体代码如下 ? 执行结果如下图所示 ?
在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语言小白进阶到高手,需要经历的是日积月累的学习。 那么如何学习呢?当然是每天都练习一道C语言题目!! ? 作者 闫小林 白天搬砖,晚上做梦。...例81:C语言实现用指向指针的指针的方法对5个字符串排序并输出。...解题思路:读者看着道题的时候,首先要知道什么时指针,指向指针的指针应该怎么用,一般在开发中不这样用,读者要看明白,这个很锻炼思维的。...char **point,*pstr[5],str[5][LINEMAX];//定义变量 for(i=0;i<5;i++) { pstr[i]=str[i]; //将第i个字符串的首地址赋予指针数组...point=pstr; sort(point);//调用sort函数 printf("————————————\n");//提示语句 printf("输出排序后的结果:\n");//提示语句
char* str[] = { "hello","hi","nihao" }; char** p; for (int i = 0; i < 3; i++) { //指针指向数组中的第几个指针...p = str + i; //想要获得指针指向的值,通过*来解引用 printf("%s\n", *p); } system("pause
大家好,又见面了,我是你们的朋友全栈君。 C++的this指针 当你进入一个房子后, 你可以看见桌子、椅子、地板等, 但是房子你是看不到全貌了。...C++在初始化对象时,每个对象中的数据成员都会得到系统分配的自己独立的存储空间。...this指针的特性: 1、this指针的类型const(类名const),为右值。 2、this指针本身不占用大小,并不是对象本身的一部分,不影响sizeof的结果。...5、只有在类的非静态成员函数中才可以使用this指针, 其它任何函数都不可以。 6、this指针时刻指向对象 。 7、当this指针指向空时,是不会指向对象的。...也就是说,成员函数的参数不能与对象的成员变量重名,如果一定要重名,就必须用this指针指明。
c语言printf输出函数的介绍 说明 1、printf可输出各种类型的数据。 2、是最灵活、最复杂、最常用的输出函数之一,它通过格式控制符对输出进行格式控制。 函数原型在头文件stdio.h中。...; char c = '@'; char *str = "abcdefghi"; //演示width printf("%10d%12lf%4c%8s\n", n, f, c, str); //... - 的用法 printf("m=%+d, n=%+d\n", m, n); //演示 + 的用法 printf("m=% d, n=% d\n", m, n); //演示空格的用法... printf("f=%.0lf, f=%#.0lf\n", f, f); //演示#的用法 return 0; } 以上就是c语言printf输出函数的介绍,希望对大家有所帮助。...更多C语言学习指路:C语言教程 本教程操作环境:windows7系统、C11版,DELL G3电脑。
(譬如int a, b, c, d;)和一次定义一个数组(int a[4]);这两种定义方法相同点是都定义了4个int型变量,而且这4个变量都是独立的单个使用的;不同点是单独定义时a、b、c、d在内存中的地址不一定相连...a做左值时表示整个数组的所有空间(10×4=40字节),又因为C语言规定数组操作时要独立单个操作,不能整体操作数组,所以a不能做左值;a做右值表示数组首元素(数组的第1个元素,也就是a[0])的首地址(...c):&a就是数组名a取地址,字面意思来看就应该是数组的地址。&a不能做左值(&a实质是一个常量,不是变量因此不能赋值,所以自然不能做左值。)...(3)指针格式访问数组元素是:*(指针+偏移量); 如果指针是数组首元素地址(a或者&a[0]),那么偏移量就是下标;指针也可以不是首元素地址而是其他哪个元素的地址,这时候偏移量就要考虑叠加了。...三、指针、数组与sizeof运算符 1、sizeof的错误纠正: sizeof是C语言的一个运算符(主要sizeof不是函数,虽然用法很像函数),sizeof的作用是用来返回()里面的变量或者数据类型占用的内存字节数
int a[5]={1,2,3,4,5}; //定义一个数组指针 int (*p)[5] ; //把数组a的地址赋给p,则p为数组a的地址 p=&a; printf("0x%x\n",a);//输出数组名...,一般用数组的首元素地址来标识一个数组,则输出数组首元素地址 printf("0x%x\n",p);//根据上面,p为数组a的地址,输出数组a的地址 printf("%p\n",*p);//*p表示数组...a本身,一般用数组的首元素地址来标识一个数组 printf("0x%x\n",&a[0]);//a[0]的地址 printf("0x%x\n",&a[1]);//a[1]的地址 printf("0x%...x\n",p[0]);//数组首元素的地址 printf("%d\n",**p);//*p为数组a本身,即为数组a首元素地址,则*(*p)为值,当*p为数组首元素地址时,**p表示首元素的值1 printf...("%d\n",*p[0]);//根据优先级,p[0] 表示首元素地址,则*p[0]表示首元素本身,即首元素的值1 printf("%d\n",*p[2]);//为一个绝对值很大的数值 return
执行p = (char *)malloc(size + 1); 这句话的作用是把申请到的堆空间的首地址,赋值给p。...在do_malloc函数中,调用系统函数malloc成功之后返回所分配空间的首地址,关键是要把这个首地址送给pData指针,也就是说要让pData指针变量中的值等于这个堆空间的首地址。...执行do_malloc(&pData, 128); 把pData指针的地址作为实参进行传递,因为pData本身就是一个指针,加上取地址符&,就是指针的指针(二级指针),因此do_malloc函数的第一个参数就要定义成...p此时是一个二级指针,参数赋值之后,p里面的内容就变成了pData这个指针变量的地址,也就是说p指向了pData这个变量。...那么在p前面加上取值操作符*,就相当于是取出指针p中的值,它里面的值就是pData!因此,malloc函数返回的堆空间首地址,就相当于是赋值给了pData,如下图: ?
一、C++ 类中的 this 指针 1、C++ 类中的 this 指针引入 在 C++ 类中 , this 指针 是一个特殊的指针 , 由系统自动生成 , 不需要手动声明定义 , 在类中的每个 非静态成员函数...中 , 都可以调用 this 指针 ; this 指针 是指向 调用对象 自身 的指针 , 也就是调用 该成员函数 的 实例对象 的 内存地址 ; 由于 this 指针只能在 非静态成员函数内部使用..., 因此 this 指针是类内部使用的指针 , 使用 this 可以访问 实例对象 中 的所有 公有 public / 保护 protected / 私有 private 成员 ; 2、C++ 类中的...this 指针用法 C++ 类中的 this 指针用法 : 使用 this 作为指针 : 在 非静态成员函数 中 , 直接使用 this 作为 本实例对象 的指针 ; this 使用 this-> 访问成员变量...访问成员变量 : 在 非静态成员函数 中 , 直接使用如下语法 , 访问 本实例对象 中的 非静态成员变量 ; 先获取指针指向的数据 然后访问数据中的成员变量 ; (*this).成员变量名 在 C++
但它也可以用于获取变量的内存地址;即变量在计算机上存储的位置。当在 C++ 中创建一个变量时,会为该变量分配一个内存地址。当我们给变量赋值时,它将存储在这个内存地址中。...注意你可能在你的程序中得不到相同的结果。为什么知道内存地址很有用呢?引用和指针在 C++ 中非常重要,因为它们使你能够操作计算机内存中的数据 - 这可以减少代码并提高性能。...C++ 指针创建指针可以使用 & 运算符获取变量的内存地址:string food = "Pizza"; // 类型为 string 的食物变量cout << food; // 输出 food 的值(...注意指针的类型必须与你正在处理的变量的类型匹配。使用 & 运算符存储名为 food 的变量的内存地址,并将其分配给指针。现在,ptr 持有 food 的内存地址的值。...总而言之,引用和指针都是 C++ 中强大的工具,可以用于高效地操作内存和数据。选择使用引用还是指针取决于具体情况。
领取专属 10元无门槛券
手把手带您无忧上云