C语言指针小结

1、  int *p = NULL 和 *p = NULL有什么区别?

第一种是定义一个int型指针,并给它初始化为NULL,也就是个空指针,没有指向任何地方,就是个空的。第二种是给指针的值赋值为NULL,也就是给指针指向的内容赋值为0(也就是为空)。

int *p = NULL相当于int *p; p = NULL;

 

2、  如何将数值存储到指定的内存地址?

Int *p=数值;

3、char*(*fun1)(char* p1,char* p2);
char* *fun2(char* p1,char* p2);
char* fun3(char* p1,char* p2);

一、指针函数一般是指返回指针的函数;

int* fun(int *a)  

{  

    return a;  

}  

int main(int argc, char **argv)  

{  

    int a = 3;  

    printf("%d", *(fun(&a)));  

    return 0;  

}  

实际上是返回一个地址

 

二、函数指针

函数可以用r = (*fun)(5);来调用,说明函数名其实是一个指针,

通过(*fun)来寻址。所以我们就可以定义一个指针

 

int fun(int i)  

{  

    return i + 1;  

}  

int main(int argc, char **argv)  

{  

    int r;  

    //r = fun(5);  

    r = (*fun)(5);      //调用方式  

    printf("%d\n", r);  

    return 0;  

也就是说,除了声明的地方,fun()与(*fun)()的作用是一样的

void (*fptr)();

把函数的地址赋值给函数指针,可以采用下面两种形式:

fptr=&Function;  

fptr=Function; 

取地址运算符&不是必需的,因为单单一个函数标识符就标号表示了它的地址,如果是函数调用,还必须包含一个圆括号括起来的参数表。
可以采用如下两种方式来通过指针调用函数:

x=(*fptr)();  

x=fptr(); 

第二种格式看上去和函数调用无异。但是有些程序员倾向于使用第一种格式,因为它明确指出是通过指针而非函数名来调用函数的。下面举一个例子:

void (*funcp)();  

void FileFunc(),EditFunc();  

main()  

{  

funcp=FileFunc;  

(*funcp)();   //调用

funcp=EditFunc;  

(*funcp)();   //调用

}  

void FileFunc()  

{   

printf(\"FileFunc\\n\");  

}  

void EditFunc()  

{  

printf(\"EditFunc\\n\");  

程序输出为:

  1. FileFunc  
  2. EditFunc 

三、指针的指针

char ** cp;

*cp就表示地址,cp表示*cp的地址

char* *fun2(char* p1,char* p2);

理解为指针函数的指针fun2相当于这个函数地址的地址

4、*(int*)&p这是什么?

&p为指针的别名,即它的另一个名字。

(int*)为强制类型转换,即把p转换为int型指针
*(int *) 是强行转换后去指针指向变量的值

 

5、  栈,堆和静态区分别是什么

百度上搜的

1、栈区(stack)—由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 分配方式 :定义于函数中的变量
2、堆区(heap) — 一般由程序员分配释放 , 若程序员不释放,程序结束时可能造成内存泄漏 。注意它与数据结构中的堆是两回事,分配方式:malloc,new出来的东西都是堆中
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域(BSS)。 -程序结束后由系统释放 定义于函数外,或者用static修饰的变量 存放于静态区。

比如一个函数中定义了一个静态变量,那么下一次调用时,取得还是原来的值

Void fun()

{

   static int i = 0;

          i++;

}

fun();

fun();

结果为2

6、  出色注释的基本要求

统一,每个地方的注释都要保持一致

规范,按照一定的标准

7、  接续符和转移符是什么?应用场景是什么?

C 语言里以反斜杠(\)表示断行。编译器会将反斜杠剔除掉,跟在反斜杠后面的字符自动接续到前一行。但是注意:反斜杠之后不能有空格,反斜杠的下一行之前也不能有空格。当然你可以测试一下加了空格之后的效果。我们看看下面的例子:
//这是一条合法的\
单行注释

相当于//这是一条合法的单行注释
/\
/这是一条合法的单行注释
#def\
ine MAC\

相当于#define MAC
RO 这是一条合法的\
宏定义
cha\
r* s="这是一个合法的\\
n 字符串";

反斜杠除了可以被用作接续符,还能被用作转义字符的开始标识。

常用的转义字符及其含义:
\n 回车换行
\t 横向跳到下一制表位置
\v 竖向跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜扛符"\"
\' 单引号符
\a 鸣铃
\ddd 1~3 位八进制数所代表的字符
\xhh 1~2 位十六进制数所代表的字符

广义地讲,C 语言字符集中的任何一个字符均可用转义字符来表示。表中的\ddd 和\xhh正是为此而提出的。ddd 和hh 分别为八进制和十六进制的ASCII 代码。如\102 表示字母"B",\134 表示反斜线,\X0A 表示换行等。

 

8、  单引号和双引号是什么?应用场景是什么?

单引号是单个字符,例如char c = ‘a’;

双引号是字符串,例如char str[] = “aaaa”;

9、  逻辑运算符是什么?和 | , &的区别在哪里

逻辑运算符: 1。&&逻辑与 2。||逻辑或 3。!逻辑非

|和&是位运算符,|类似或,比如001 | 101=101

&类似与,001 & 101=001

这里是二进制,若是十进制则是1和5

10、              <<       >>是什么?

<<左移位运算符,相当于除2,例如i=8;I = I <<2;i的结果为2

>>右移位运算符,相当于乘2,例如i=1;I = I>>2;i的结果为4

11、              {}有啥作用?

表示变量作用的范围

Void fun()

{

Int I;

{

Int i;

}

{

Int i;

}

}

这3个i是不同的局部变量

12、              ++,--有啥作用?

自增和自减运算符

13、              int i=3;++i+++i+++i;这是什么?

   (++i++) + (i++) + i

(++i++)是错误的,不同的编译器中会有不同的结果

14、      运算符的优先级是怎么样的?

 

 

15、      定义数组的时候,必须指定其元素的类型和个数吗?

16、      上次的那个数组和指针的图片,理解了么?

17、      什么是函数指针?

18、      函数指针的使用,举个例子

19、      函数指针数组是什么

20、      函数指针数组的指针,怎么理解

21、      什么是野指针

22、      怎么为指针分配内存大小

23、      什么是内存越界

24、      什么是内存泄露

25、      怎么使用malloc

    malloc()函数的调用方式是:(指针所指对象的数据类型 *)malloc(sizeof(所指对象的数据类型)*个数)

malloc函数的功能是从内存中申请一块指定字节大小的连续空间,返回改存储块的首地址作为函数的结果。如果申请失败,说明没有足够的空间可供分配,返回空指针NULL。

注意:malloc函数必须说明为“void *malloc();”或者在程序的头文件中加入“#include “stdlib.h””。使用malloc函数申请的空间必须用free()函数释放。free(指针变量名)函数的功能是释放以指针变量名所指的位置开始的存储块,以分配时的存储块为基准。语句“free(p)”不改变p的内容但是,该语句执行以后,就不能再用任何指针访问这个存储区。

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

   p=(char *)malloc(LIMIT);

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

 

26、      怎么释放内存

27、      内存释放后,要注意什么

 

 

 

28、      int i=2;int k1=++i;int k2=i++;其中k1和k2的值是什么?

k1=3,k2=3

因为++i是先把i加1,而i++是先用i的值再把i的值加1

 

posted @ 2017-10-20 17:22  梓夙  Views(237)  Comments(0Edit  收藏  举报