c语言指针

c语言面试题__指针篇

心不动则不痛 提交于 2019-11-27 09:41:52
文章转载自: http://www.pythonheidong.com/blog/article/2541/ 1. char * const p;   char const * p   const char *p   上述三个有什么区别?   char * const p; //常量指针,p的值不可以修改   char const * p;//指向常量的指针,指向的常量值不可以改   const char *p; //和char const *p ------------------------------------------------------ 2. char str1[] = "abc";   char str2[] = "abc";   const char str3[] = "abc";   const char str4[] = "abc";   const char *str5 = "abc";   const char *str6 = "abc";   char *str7 = "abc";   char *str8 = "abc";   cout << ( str1 == str2 ) << endl;   cout << ( str3 == str4 ) << endl;   cout << ( str5 == str6 ) << endl;   cout

9、用指针处理链表问题(何为p=p->next;何为p->next=p?)

三世轮回 提交于 2019-11-27 09:41:12
其实中间还有一个二维数组指针问题,不过,先放一放吧,把链表这块的问题先理一理。 1.关于链表的几个概念点: 一个单链表的头结点,头指针,(开始结点)首结点,(终端结点)尾结点,尾指针的描述。我觉得这个还是相当重要的一个点的,我开始学的时候就对这个有点迷糊,又是头结点,又是头指针的。但是理解了其中的含义后,对链表的理解又更进一步了,废话不多说 首结点:第一个有效结点,也就是第一个存放有效数据的结点。 尾结点:最后一个有效结点,也就是最后一个存放有效数据的结点。 头结点:位置在首结点之前,不存放有效数据,也不存放整个链表有效结点的个数,为什么要加上一个头结点?因为可以方便对链表进行操作。头结点的数据类型与首结点数据类型一致。 头指针(一般用head表示):指向头结点的指针变量,存放了头结点的地址(注意不是首结点) 尾指针:指向尾结点的指针变量,它的地址部分为NULL。 一般来说,确定一个链表只需要知道头指针一个参数即可。 那什么是链表呢?形象一点来说就是:幼儿园的老师带着孩子出去散步,老师牵着第1个孩子的手,第1个小孩的另一只手牵着第2个小孩.....这就是一个“链”,最后一个孩子有一只手空着,它是就是(终端结点)尾结点。要找到这个队伍,就必须先找到老师,然后顺序找到每一个孩子。 链表指针是C语言的一个难点,但也是重点,学懂了非常有用。要仔细讲就必须先讲变量、指针。 什么是变量

C语言--指针交换两个变量

我与影子孤独终老i 提交于 2019-11-27 09:40:01
何为指针?指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。 例如: int *p; //* 表示指针说明符:说明变量p是一个指针,只会在定义变量的时候出现 int a; p = &a; // &符号表示取a的地址,如果a是数组p=a,表示数组的首地址 a=5; // *p = 5; *代表指针运算符,访问对应地址里面的内容 今天要说的是,两个变量之间的交换,用普通的变量和指针有何不同?先来看下面的一个例子: 这里提一下,关于交换变量的几种方法,详见 C语言交换变量方法 ,这里就不再重复了。 #include<stdio.h> void swap(int x,int y){ //交换前的x,y printf("x,y交换前: x = %d,y = %d\n",x,y); x^=y; y^=x; x^=y; //交换后的x,y printf("x,y交换后: x = %d,y = %d\n",x,y); } int main(){ int a=9,b=2; //交换前的a,b printf("a,b交换前: a = %d,b = %d\n",a,b); swap(a,b); //交换后的a,b printf("a,b交换后: a = %d,b = %d\n",a,b); } 相信大家都很明白,这个方法无非就是交换a,b两个变量的值,但是,结果是怎样呢? x

C语言 指针的基本知识

梦想与她 提交于 2019-11-27 08:30:44
内存的单位: bit 一个bit位能存储1个二进制 内存的最小单位。 1byte = 8bit,一次性使用的最小单位,操作系统会为每个字节分配一个编号(天然按位置排列)。 1kb = 1024byte 1mb = 1024kb 1gb = 1024mb 1tb = 1024gb 1pt = 1024tb 什么是指针: 指针变量的取值范围取值0~4G 指针是一种数据类型(无符号整数,代表了内存编号) 使用它可以用来定义变量(与int、long一样), 与int、long不同的它存储整数代表了内存的编号, 通过这个变量可以访问对应编号的内存。 为什么使用指针: 1、堆内存无法取名字(无法使用标识符与堆内存建立联系),必须配合指针。 2、函数之间的参数是值传递(内存拷贝),使用指针可以优化参数的传递效率 (需要对变量进行保护)。因为C语言采用的是值传递(内存拷贝), 会随着变量字节数的增加而降低运行效率 而传递变量的地址永远只拷贝4或8字节 void func(const int* p); 但使用指针变量的值可能会被修改,可以配合const 3、函数之间是相互独立的,有时协同配合需要共享变量 (全局变量过多会造成命名冲突,不会被释放浪费内存), 函数之间传递变量的地址可以达到共享变量的效果。 如何使用指针: 定义:类型* 变量名_p; 1、指针变量与普通变量一样默认值不确定

C语言之灵魂 指针学习

风格不统一 提交于 2019-11-27 08:03:02
  指针是c语言的难点 称之为c语言的灵魂一点也不为过,不过指针用好了能事半功倍,用不好bug满天飞。 一、指针的概念   指针也是变量只不过是特殊的变量,指针的值是另一个变量的地(也就是变量所在的内存地址)   指针的定义:在变量名之前加 * 号即可。 如:char *point;   tips:请明确区分 “指针的地址” 和 “指针指向的地址” 的概念。 因为指针也是一个变量也有自己的地址。(也就是指针的地址) 二、指针的应用    1.指针与普通变量    指针与普通变量比较简单,正如上文概念里面所提及的,当指针指向一个普通变量时,指针的内容也就是变量的地址。    例如:int a=123;       int *point =&a; // & 取地址符号       printf(" *point=%d ",*point);// 结果是 *point=123          2.指针与数组     这里会涉及两个概念 指针数组 和 数组指针 ,可能这也是让各位同学发懵的地方。         数组指针:指向数组的指针就是指针数组,是不是很简单呢。            char test[5]="hello"; //定义普通的字符数组           char (*point)[5]=&test; //定义指针指向数组 指针指向一个数组 该数组含有五个元素    

const的理解、const指针、指向const的指针

随声附和 提交于 2019-11-27 07:50:16
1、const 的理解 const 是C语言的一个关键字,需要注意的是,const 关键字是把变量变为一个只读的变量(也就是不可以作为左值),绝对不是将这个变量变为常量。也就是说经过const 修饰的变量成为只读的变量之后,那么这个变量就只能作为右值(只能赋值给别人),绝对不能成为左值(不能接收别人的赋值)。 而 C++ 则是将 const 修饰的常量变为一个真正的常量(变量的内容不可以被修改), 这一点的区别需要进行注意。当 const 变量的时候,就将这个常量放在符号表里面,编译的过程中发现使用了变量,那么就从符号表里面的值进行替换。 经过const 修饰的变量,在定义的时候,就要进行初始化。 const int a = 10; // 正确 const int a; // 错误 const 关键字最有用的地方是用来限定函数的形参 func(const char *ptr) { } 这样 ,func 函数将不会修改实参指针所指的数据,但是其他的函数却可以修改他。 const 本质上被命名为 readonly 更为合适。 2、指向const的指针 首先,是一个指针,但是这个指针是指向一个const 类型的指针。 一般: const int *p // 一般使用这个 或者: int const *p 第一种:首先 P 是一个指针,P所指向的内容(*P)所指向的内容是 const

指针的妙处

回眸只為那壹抹淺笑 提交于 2019-11-27 07:11:40
这次比赛,我算是明白了指针是有多吊了。 在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。 [1] 在高级语言中,指针有效地取代了在低级语言,如汇编语言与机器码,直接使用通用暂存器的地方,但它可能只适用于合法地址之中。指针参考了存储器中某个地址,通过被称为反参考指针的动作,可以取出在那个地址中存储的值。作个比喻,假设将电脑存储器当成一本书,一张内容记录了某个页码加上行号的便利贴,可以被当成是一个指向特定页面的指针;根据便利粘贴面的页码与行号,翻到那个页面,把那个页面的那一行文字读出来,就相当于是对这个指针进行反参考的动作。 [2] 在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)【用来指向该内存地址所对应的变量或数组】。指针一般出现在比较接近机器语言的语言,如汇编语言或C语言。面向对象的语言如Java一般避免用指针。指针一般指向一个函数或一个变量。在使用一个指针时,一个程序既可以直接使用这个指针所储存的内存地址,又可以使用这个地址里储存的函数的值。 ——百度百科 当我们要进行数组交换的时候

c语言指针

你说的曾经没有我的故事 提交于 2019-11-27 06:59:13
int a = 10; int *p = &a; void increament(int *p) { (*p)++; } void swap(int *a, int *b); int main(void) { int a = 10; increament(&a); printf("%d\n", a); } int arr[] = {5, 6, 7, 8, 9}; int *p = &arr[0]; void move_p(int *p, int arr[]) { p = &arr[1]; } void move_pp(int **p, int arr[]) { *p = &arr[1]; } int *move_pr(int *p, int arr[]) { p = &arr[1]; return p; } int main(void) { int arr[] = {5, 6, 7, 8, 9, 10} int *p = &arr[0]; move_p(p, arr); printf("%d\n", *p); move_pp(&p, arr); printf("%d\n", *p); p = move_pr(p, arr); printf("%d\n", *p); } 来源: https://www.cnblogs.com/xuzhaoping/p/11349638.html

C语言的灵魂——指针基础

血红的双手。 提交于 2019-11-27 03:32:21
一、什么是指针 1、指针的定义:地址形象化为指针,通过指针能够找到内存单元。         指针变量就是地址变量,变量的值为指针。 指针其实是我们将变量名和地址的关系显化(独立)出来的一种形式,是为了我们更加方便的读取数据和进行操作而设计的,是c语言的灵魂。 解释: int a; printf("%d,a"); 如上,我们通常是通过变量名来引用变量的值,如上面的 printf( " %d,a "); 一句,我们就是通过引用a的变量名来输出变量a的值。 为了理解上述的概念,我们必须理解这两个概念: 存储单元的地址  系统分配地址  类似于房间号 存储单元的内容  自定义内容   类似于房间里的人 2、常用的两种访问方式 直接访问  间接访问 int a; a = 3; //直接访问 printf("%d,a"); //间接访问 int *a_pointer; a_pointer = &a; printf("%d,*a_pointer"); 直接访问就是通过变量名进行访问,间接访问就是通过指针进行访问。 二、指针变量 定义:存放地址(指针)的变量。 1、定义指针变量 方式:类型名 *指针变量名 int *p;// int——基类型,不可少 基类型用来指定此类指针变量可以指向的变量类型。如上面的p指针只可以用来指向整数类型的变量。 Zu

VC++ 字符串操作学习总结

北慕城南 提交于 2019-11-27 03:01:36
vc++中各种字符串(转载) http://www.cnblogs.com/tomin/archive/2008/12/28/1364097.html CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常 量的TCHAR指针。 CString 是一个完全独立的类,动态的TCHAR数组,封装了 + 等操作符和字符串操作方法。 typedef OLECHAR FAR* BSTR; typedef const char * LPCTSTR; vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传 统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在 win32中较多地使用LPSTR。 而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变, 除此之外,它与LPSTR是等同的。 1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位