1、const
定义:将 const 变量称为常量,常量一旦被创建后其值就不能再改变,所以常量必须在定义的同时赋值(初始化),后面的任何赋值行为都将引发错误。
const int MaxNum = 100; //班级的最大人数
MaxNum = 90; //错误,试图向 const 变量写入数据
区分 int const* 和 int* const
(1)int const*所修饰的指针变量,其指针变量本身(即指向元素的地址)是可以被修改的,但是其指针所指向的值是不允许被修改的。
(2)其实是const 和符号**的位置关系,const的位置可以放在int 的前面,也可以放在int 的后面,不会产生影响。即
(3)int* const 是一个指向可修改的整型的常量指针,也就是说,其指针变量本身所指向的地址是不可以被改变的,但是可以改变其指针所修饰的值。
int const * const
(4)int const * const 是指向一个常量整数的常量指针。也就是说,其指针变量所指向的地址和其地址所对应的整型值都是不允许改变的。
2.sizeof和strlen
sizeof操作符的结果类型是size_t,它在头文件<stddef.h>中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。(一定是正数)
strlen()用来计算指定的字符串s 的长度,不包括结束字符**\0**。
(1)整形数组
再次复习两个知识点:指针大小为4字节或8字节;sizeof(arr)或&arr代表整个数组
(2)字符数组
(3)数组表示字符串
可以认为:字符串=字符+\0,因此sizeof空间大一。
重要:strlen( arr +0 )和strlen(&arr)都是指向第一个元素的地址,而指针和数组的关系就是相互表示,然后从该地址往后数。
(4)指针表示字符串
(5)二维数组
3.几道练习题
第一题:
#include<stdio.h>
int main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int *ptr = (int *)(&a + 1);
printf("%d %d\n", *(a + 1), *(ptr - 1));
return 0;
}
第二题:
#include<stdio.h>
int main()
{
char * a[] = { "work", "at", "alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
第三题:
#include<stdio.h>
int main()
{
int a[5][5];//5行,每行有5个元素
int (*p)[4];//每4个元素为一组
p = a;
printf("%p %d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);
//FFFFFFFC -4
return 0;
}