C初阶
1.数组和指针
1.1什么是指针数组,什么是数组指针?
**指针数组:是指的数组里面装着指针,它是一个数组,定义形式可以理解为int (a[10]),说明括号里面的a是一个数组,包含了10个元素,每一个元素的类型为 int
int a = 16, b = 932, c = 100;
//定义一个指针数组
int *arr[3] = {&a, &b, &c};//也可以不指定长度,直接写作 int *arr[]
//parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,
//它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
//arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。
int **parr = arr;
printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//16, 932, 100
printf("%d, %d, %d\n", **(parr+0), **(parr+1), **(parr+2));//16, 932, 100
数组指针: 是一个指向数组的指针,他其实还是一个指针,只不过是指向数组 **定义形式为:*int(*a)[10],因为[]的优先级高于,所以必须添加(*a)。
在32位系统下任何类型的指针所占内存大小都为4个字节,至于它指向的数组占多少字节,具体要看数组的大小。总之,数组指针即为“指向数组的大小”。
详细了解http://t.csdn.cn/V1qUT
1.2函数指针,要如何定义一个函数指针?
函数指针的本质是一个指针变量,该指针指向这个函数,总结就是函数指针就是指向函数的指针
**定义格式:**类型说明符(*函数名)(参数)
**详细了解:**https://huaweicloud.csdn.net/63a56868b878a54545946a07.html?spm=1001.2101.3001.6650.8&utm_medium=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-8-80428882-blog-125746492.235%5Ev38%5Epc_relevant_sort_base2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2defaultBlogCommendFromBaiduactivity-8-80428882-blog-125746492.235%5Ev38%5Epc_relevant_sort_base2&utm_relevant_index=13&q=sizeof%20%E5%92%8C%20strlen%E7%9A%84%E5%8C%BA%E5%88%AB
int (*fun)(int x,int y);
函数指针是需要把一个函数的地址赋值给它,有两种写法:
fun = &Function;
fun = Function;
调用函数指针的方式也有两种:
x = (*fun)();
x = fun();
示例:
int add(int x,int y){
return x+y;
}
int sub(int x,int y){
return x-y;
}
//函数指针
int (*fun)(int x,int y);
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
//第一种写法
fun = add;
qDebug() << "(*fun)(1,2) = " << (*fun)(1,2) ;
//第二种写法
fun = ⊂
qDebug() << "(*fun)(5,3) = " << (*fun)(5,3) << fun(5,3);
return a.exec();
}
1.3 sizeof 和 strlen的区别?
- strlen是一个库函数,sizeof是一个运算符号
- strlen计算的是’\0’之前的字符个数,计算时不包含’\0’,遇到’\0’才结束。sizeof计算的是所占空间内存大小单位是字节它计算时包含’\0’。
- sizeof的类型是无符号整型,strlen只能用char做参数,sizeof可以用类型做参数。
char arr1[] = "hello";
char arr2[] = { 'h','e','l','l','o' };
char arr3[] = { 'h','e','l','l','o','\0'};
printf("%d\n", strlen(arr1));
printf("%d\n", strlen(arr2));//随机值,只有遇到'\0'才结束,而arr2中没有'\0'
printf("%d\n", strlen(arr3));
**详细了解:**http://t.csdn.cn/0zgHt
总结:计算数组的大小和指针大小的题要多做,非常容易搞错
2.数组存储
2.1原码、反码、补码的存储规则
**数据的存储方式是:**正数和负数在内存中的存储:原码、反码、补码所有的数据都是在内存中以补码的形式存在。
正数的原码、反码、补码都是一样的,32位,
负数
原码:最高位表示符号位,1表示负数,0表示正数。
反码:原码除了符号位之外,1变0,0变1。
补码:在反码的基础上加1