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\");
}
程序输出为:
- FileFunc
- 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