c语言指针

C++常见面试题(一)

与世无争的帅哥 提交于 2019-12-02 11:12:28
C++和C的区别 设计思想上: C++是面向对象的语言,而C是面向过程的结构化编程语言 语法上: C++具有封装、继承和多态三种特性 C++相比C,增加了许多类型安全的功能,比如强制类型转换 C++支持范式编程,比如模板类、函数模板等 C++中指针和引用的区别 指针有自己的一块空间,而引用只是一个别名 使用sizeof计算一个指针的大小为4,而引用则是被引用对象的大小 指针可以初始化为空,而引用必须被初始化且必须是一个已有对象的引用 作为参数传递时,指针需要被解引用才可以对对象进行操作,而对引用的修改都会直接改变引用所指的对象 可以有const指针,但没有const引用 指针可以指向其他对象,但引用只能是一个对象的引用,不能被改变 如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄漏 指针和数组的区别 数组:数组用于存储多个相同类型数据的集合,地址是连续的 指针:指针相当于一个变量,存放的是内存中的地址 区别: • 赋值:同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝 • 存储方式:数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。 • 求sizeof

c/c++总结

浪尽此生 提交于 2019-12-02 10:47:13
1. 0X0 0x0地址是NULL 2. Gdb调试子进程 1.set follow-fork-mode <parent/child> 这条命令可以用于在调试父进程或是子进程的模式之间进行切换。例如在 fork 函数执行之前执行 set follow-fork-mode child, 当 fork 执行后,设定在子进程上的断点将会有效,而父进程上的断点此时无效;反之依然。缺省 gdb 是调试主进程的。 2.attach<pid> GDB 有附着( attach )到正在运行的进程的功能,即 attach <pid> 命令。因此我们可以利用该命令 attach 到子进程然后进行调试。 3. Gdb调试nginx 多进程调试 #sudo gdb –q (gdb)shell ./nginx 如果只是gdb ./nginx 那么启动nginx还是单进程 4. Linux内核模块编写和makeFile编写 hello.c内容: #include <linux/module.h> #include <linux/init.h> static int hello_init(void) { printk( KERN_ALERT " hello world enter \n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT

ARTS第九周

旧巷老猫 提交于 2019-12-02 09:38:47
1.Algorithm:每周至少做一个 leetcode 的算法题 2.Review:阅读并点评至少一篇英文技术文章 3.Tip:学习至少一个技术技巧 4.Share:分享一篇有观点和思考的技术文章 以下是各项的情况: Algorithm 链接: [LeetCode-19]-remove-nth-node-from-end-of-list 题意: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 分析: 用快慢指针,快指针先移 n 个节点。 一起移动,两指针之间一直保持 n 个节点,当快指针到链表底了,操作慢指针,删除要删除的元素 时间复杂度:O(n)O(n) class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null || n < 1) return head; // 给个负数 万一出错好排查,因为list一般给的正的 ListNode r = new ListNode(-1); r.next = head; ListNode slow = r; // 慢指针 // 快指针 ListNode fast = r; for (int i = 0; i < n; i++) { fast =

指针指针!!

末鹿安然 提交于 2019-12-01 23:33:12
认识指针以及学会使用指针 本人对于指针的认识只是停留在如何基础的使用的层面上,指针是C语言的核心,也是因为指针,使得C语言能够如此的灵活多变。 注:本文章也仅限于个人观点,如有纰漏,还望指出,肯请谅解 (一)认识指针 指针,什么是指针,意思是指向什么东西的标志。 指南针指向南方,是指针;高速路上的指示路标箭头,那也是指针。所以,不要害怕指针这个新名词,任何名称诞生的时候都是为了让人们容易理解容易记住。所以呢,,不要把它想得太复杂。。 与如上所说的指针类同,C语言的指针也是指向某个东西的标志。那么C语言指针指向的是什么呢? 是地址,那什么又是地址呢? 计算机的内存是一片连续的空间,每一个子单元都有它的地址,也就是它的位置,地址是独一无二的。就相当于你家庭住址—重庆市江北区XX街道XX小区X单元。 那么,指针也就是家庭住址的路标了,也就是一个箭头,它会在上面标明,“我指的方向是善良先生的家!” 懂了吧,联系生活实际来想这个问题就不会那么枯燥无味,也更好理解。 (二)定义指针类型 1 int a = 4; //类型为int整型的变量a赋值为4 2 int *p; //定义一个指向int类型的指针变量p 3 //相似的,char *p 意味着指向char类型的变量p 4 p = &a; //&符号是取地址符号,scanf()函数里的&符号的作用也是一样 5 //那么,到这里

C零基础视频-38-函数指针与typedef

余生颓废 提交于 2019-12-01 17:23:39
目录 函数指针的定义 函数指针的复杂性 typedef 函数指针的定义 函数在内存中也是有地址的: #include <stdio.h> void fun() { printf("hello, world\r\n"); } int main(int argc, char* argv[]) { printf("%p\r\n", fun); return 0; } 既然有地址,就可以定义指针存储改地址,存储函数(首)地址的指针,称为 函数指针 。 函数指针的定义有些特别,比如,定义一个可以指向 返回值为int,有一个int参数的函数 的指针,声明如下: #include <stdio.h> int fun(int arg) { printf("hello, world\r\n"); } int main(int argc, char* argv[]) { int(*pfn)(int) = NULL; pfn = fun; return 0; } 函数指针的声明,可以按以下步骤完成: 先写出目标函数的原型 将目标函数的函数名改为函数指针变量名 为“*”号和函数名加括号 函数指针的复杂性 想象一下,如果我们定义了一个函数,其 参数是一个函数 , 返回值也是一个函数 ,原型分别为: 参数:无参数,无返回值 返回值:有一个int参数,有一个int返回值 最终完成声明的代码类似如下:

C语言字符串操作小结

狂风中的少年 提交于 2019-12-01 16:22:41
1)字符串操作 strcpy(p, p1) 复制字符串 strncpy(p, p1, n) 复制指定长度字符串 strcat(p, p1) 附加字符串 strncat(p, p1, n) 附加指定长度字符串 strlen(p) 取字符串长度 strcmp(p, p1) 比较字符串 strcasecmp忽略大小写比较字符串 strncmp(p, p1, n) 比较指定长度字符串 strchr(p, c) 在字符串中查找指定字符 strrchr(p, c) 在字符串中反向查找 strstr(p, p1) 查找字符串 strpbrk(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找该集合的任一元素 strspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找不属于该集合的任一元素的偏移 strcspn(p, p1) 以目标字符串的所有字符作为集合,在当前字符串查找属于该集合的任一元素的偏移 * 具有指定长度的字符串处理函数在已处理的字符串之后填补零结尾符 2)字符串到数值类型的转换 strtod(p, ppend) 从字符串 p 中转换 double 类型数值,并将后续的字符串指针存储到 ppend 指向的 char* 类型存储。 strtol(p, ppend, base) 从字符串 p 中转换 long 类型整型数值,base 显式设置转换的整型进制

嵌入式经典问题汇总

我与影子孤独终老i 提交于 2019-12-01 15:39:38
1) 对于整形变量A=0x12345678,请画出在little endian及big endian的方式下在内存中是如何存储的 。 little endian big endian 刚好反过来 高地址--〉 0x12 低地址--〉 0x12 0x34 0x34 0x56 0x56 低地址--〉 0x78 高地址--〉 0x78 2) 在ARM系统中,函数调用的时候,参数是通过哪种方式传递的? 参数<=4时候,通过R0~R3传递,>4的通过压栈方式传递 3) 中断(interrupt,如键盘中断)与异常(exception,如除零异常)有何区别? 异常:在产生时必须考虑与处理器的时钟同步,实际上,异常也称为同步中断。在处理器执行到由于编程失误而导致的错误指令时,或者在执行期间出现特殊情况(如缺页),必须靠内核处理的时候,处理器就会产生一个异常。 所谓中断应该是指外部硬件产生的一个电信号,从cpu的中断引脚进入,打断cpu当前的运行; 所谓异常,是指软件运行中发生了一些必须作出处理的事件,cpu自动产生一个信号来打断当前运行,转入异常处理流程。 2 . 写一个"标准"宏MIN ,这个宏输入两个参数并返回较小的一个。 #define MIN(A,B) ((A) <= (B) ? (A) : (B)) 【 程序员面试宝典 】 这个测试是为下面的目的而设的: 1) 标识

C语言指针与数组

徘徊边缘 提交于 2019-12-01 15:30:38
C语言数组下标 [] 符号竟是个语法糖? 123456789101112131415 struct { int a[100]; int b[100];};int大专栏 C语言指针与数组> main() { struct ins; int i = 0; for(; i<200; i++) { ins.a[i] = 1; } return 0;} 问:上述程序在运行时是否会产生数组越限? 答:不会。 《C程序设计语言》(第2版·新版)P84写到: 对数组元素a[i]的引用也可以写成 (a+i)这种形式,在计算数组元素a[i]的值时,C语言实际上先将其转换为 (a+i)的形式,然后再进行求值。 如果你没注意到此特性,将有可能导致灾难。 来源: https://www.cnblogs.com/wangziqiang123/p/11690801.html

C语言指针

邮差的信 提交于 2019-12-01 15:17:06
C语言是一款强大的语言,也是一本比较简单容易上手的编程语言,但是C语言也有重点难点,那就是指针和链表,我一直不得其门而入,现在我想记录下所有我在学习指针和链表过程中的重点。 指针的含义 相信很多在学指针的你们应该都能在网上看到了一个说法,那就是C语言的指针其实也是属于变量,只不过这是一种特殊的变量,是用来保存变量地址的变量。 指针的用处 看下面的代码例子: #include "pch.h" #include <stdio.h> void change(int x, int y) { int temp = x; x = y; y = temp; } int main() { int a = 3; int b = 6; change(a, b); printf("a=%d,b=%d\n", a, b); return 0; } a和b通过change方法交换值,这个方法貌似没什么问题,然而输出的结果却是两个值并没有交换。 结果显示依然是a=3,b=6。为什么会这样呢,我是学C#出身的,更加不能理解结果会是这样,但是我忘记了,C语言是面向过程的语言,并不像C#是面向对象的语言。 C语言普通的函数参数是传值的参数,main函数中的a和b与函数change的参数x和y是不同的值,虽然a通过change函数传值,使得a和x的值相等,但是也仅仅是值相等,两个值的地址并不是同一个地址,所以

面试之C++语言相关题目

≯℡__Kan透↙ 提交于 2019-12-01 10:43:32
【C语言】 main()函数是开始执行时所执行的程序的第一个函数,但不是第一个执行的函数。第一个执行的函数是_start(),它通常由C运行库提供,在编译程序时自动链入,此细节高度依赖于操作系统和编译器工具链。 【C++语言特性】 C和C++的区别,C++的好处 C 和C++的对比和好处,在平时应用上有什么感受 C语言的结构体和C++的结构体有什么异同点 C++的结构体其实就是类的一种,只不过类成员默认访问权限是private,结构体默认访问权限是public。 C语言的结构体是不能有函数的,而C++可以有。 C语言的结构体中数据成员没有private、public和protected访问限定,而C++的结构体有访问限制。 C语言的结构体没有继承关系,C++结构体有丰富的继承关系。 new可以搭配free吗,为什么 delete a和delete a[]区别 new是堆分配还是栈分配 new与malloc的区别 c++11 throwing(1) void* operator new (std::size_t size); nothrow(2) void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept; placement(3) void* operator new