free用来释放指针变量空间,释放后指针变量为空指针(NULL)但是free不会更改指针变量的内容。 指针的长度是4(32位)或8(64位)字节。 如指针的数据类型是int * ,指针实际指向内容的类型是int。
上图中“hello world”是一个常量字符串,将字符串的首元素h的地址存放在指针p中, * p解引用后 * p为h,不等价于hello world。
p=&arr中,arr是数组,数组的地址只能存放在数组指针中。
数组名表示首元素地址,等同于&arr[0]。&arr表示整个数组。
两个数组的内容可能相同,但两个数组的内存空间相互独立,两个数组的数组名等于各自首元素的地址。 str1不等于str2。 两个完全相同的常量字符串在内存中只保留一份, 即str3和str4保存的地址都是常量字符串首字符的地址。 ::: warning 创建数组str:
char str[] = "hello world"; //数组内容可修改
使用指针str指向内存中常量字符串:
char* str = "hello world"; //常量字符串不可修改
数组存放在内存的栈区;常量字符串存放在内存的只读数据区中。 :::
int* fun(int a, int b);
//函数声明,函数名是fun,参数是两个整型,返回类型是int*
int(*)fun(int a, int b);
//语法错误
int(*fun)(int a, int b);
//(函数指针)
(int*)fun(int a, int n);
//函数声明,和第一行代码一样
A
B
首先判断是一个数组指针,数组中每一个元素都是一个函数指针,需要有一个函数指针的数组。
A.(int* p[10]) (int*)
//p和[]结合表示是数组,去掉数组名和[]剩下的语法错误
B.int[10] * p(int*)
//p和()结合表示是函数
C.int(*(*p)[10])(int*)
//p和[]结合表示是数组,数组类型是int(*)指针,指向的函数参数类型是(int*)
D.int((int*)[10])* p
//语法错误
B A中函数的参数类型与题目不一致。 C和D中的pf先和()结合形成函数,构成一个函数声明:参数无参,返回类型void*。