---------------------- IOS培训.期待与您交流! ----------------------
C语言学习笔记五
---既然决定14年要好好的努力一次,那么就不要再轻言放弃,不再在随波逐流。只有努力过、拼搏过,才会知道自己行还是不行!为自己加油!---
---总结的知识点可能有不正确的地方,如果有发现请留言给我,我一定及时更正,不让错误的知识去误导大家,有好的意见也可大声提出来,小弟一定愿意采纳---
C语言的数据类型
1、分类基本数据类型 int double float char
构造类型 数组
数组的定义格式 类型 数组名[元素个数]; 如 int args[5]; 定义一个大小为5的整形数组
注意 C语言中不支持 int[] array 这样的定义形式
特殊赋值方式(把数组中某个值赋值) int a[5] = {[2] = 10, [4] = 2}; 把数组的的 2、4 元素赋值
int args[]; //错误 需要初始给定大小
int args[5]; args = {10,11,12,13,14}; //错误 只能在定义数组的同时进行初始化
int args['A'] = {10,11}; //正确 'A'字符常量 65
int args[count] = {10, 11, 13}; //如果想再定义数组同时进行初始化,数组元素个数必须是常量,或者不写
2、计算数组的长度
C语言非面向对象语言,所以计算数组的长度不能用 .length 这种面向对象的方法。
C语言计算数组长度方法 int count = sizeof(args) / sizeof(int);
先计算数组占内存的大小,在除以数组类型占内存的大小 就是数组的个数
3、数组在内存中存储顺序:
数组的第一个元素会存在被分配内存的低位置部分。由低到高,与其他类型的存储方式相反。
4、数组作为参数:
数组作为函数参数,可以省略元素个数。 int test(int ars[]);数组作为函数参数,传递是整个数组的地址,修改函数形参数组元素的值,会影响到外面的实参数组。
数组当作函数参数传递时,会当作指针变量来使用,如果这时来计算数组的长度就会不准确,(指针变量在64bit编译器环境下占8字节)
所以在需要传递数组长度时,要在定义数组的位置先计算出来,在把长度当作参数传递过去。
5、C语言中的字符串
C语言中字符串用字符数组存储 没有JAva中的String 之说(字符串也就等价于字符串数组)(比较特殊,仔细想想)
字符串结束标识 \0 (ASCII码值为0)
以下四种均可当作字符串
char a[6] = "it";
char a[6] = {'i', 't', '\0'};
char a[6] = {'i', 't', 0};
char a[6] = {'i', 't'}; //指定了长度 后面省略0
这个不是字符串,只能说是一个字符数组 (注意这个和上面的区别,主要是没有指定长度)
char a[] = {'i', 't'};
字符串输出用%s(实质是按字符输出,遇到\0时结束)
6、strlen 函数:
计算字符串长度。 strlen函数声明在string.h文件中1). 计算的是字符数,并不是字数
2). 计算的字符不包括\0
3). 可以从某个地址开始数字符个数,遇到\0 就结束
int size = strlen("哈haha"); size = 7 哈 占用3字符
7、字符串数组(字符串也就等价于字符串数组)(比较特殊,仔细想想)
char names[2][10] = {"jack","rose"}; (二维数组)
实质
char names[2][10] = {'j','a','c','k'},{'r','o','s','e'};
printf("%s",names[0]); // jack
printg("%s",names[1]); // rose
printf("%c",names[0][3]) // k
8、指针(重点)
指针变量定义格式 变量类型 *变量名;
定义一个指针变量p int *p; (定义变量时的*仅仅是一个象征,没有其他特殊含义。)
指针变量只能存储地址
如 int *p; int a = 90; p = &a; 把变量a的地址给p。指针变量p指向了变量a
*p 访问指针变量p指向的存储空间 如上面例子,*p就是访问a的存储空间
指针就一个作用,能够根据一个地址值,访问对应的存储空间
指针变量p前面是int 表示 指针变量p只能指向int类型的数据
int *p; double d = 10.0; p = &d; //不建议这样写,int *p 只能指向int类型的数据
int *p; p = 200; // 指针变量只能存储地址
int *p; printf("%d\n", *p); //指针变量未经过初始化,不要拿来间接访问其他存储空间。
int *p; *p = &a; //不正确的写法,不需要&符。
*p = 20; 含义: 把指针变量p指向的存储空间的数值修改为20
9、指向指针的指针
int *p = &a; int **p1 = &p; // 指针类型 如 int * 把它再用指针指向他就是 (int *)* = int **
/**间接修改函数变量的值,已达到多个返回值的情况**/
int sumAndMinus(int n1, int n2, int *n3);
int main()
{
int a = 9, b = 10;
int sum , minus;
sum = sumAndMinus(a, b, &minus); //将minus的地址作为参数传递
printf("%i,%i", sum, minus);
return 0;
}
int sumAndMinus(int n1, int n2, int *n3)
{
*n3 = n1 - n2; //通过指针类型将外面参数的数值修改(指针变量去接收地址值)
return n1 + n2;
}
%d int
%f float\double
%ld long int
%lld long long int
%c char
%s 字符串
%zd unsigned long
任何指针都占用8个字节的存储空间。
int array[5] = {1,2,3,4,5};
int *p;
p = &array[0]; //指针变量p指向数组中第一个元素。
/*
p + 1 ----> &array[1]
注意 指针变量的加减是内存地址的加减,内存地址具体加多少与指针变量的类型有关 如 int 类型 每次地址值加 4字符
*/
int array[5] = {1,2,3,4,5}; int *p; p = array; //数组名就是数组的地址,也就是数组首元素的地址 所以不用 &
11、数组的访问方式:
int array[4];
int *p;
p = array;
1、数组名[下标] array[i]
2、指针变量名[下标] p[i]
3、*(p + i)
指针变量的+1究竟加多少,取决于指针的类型 int * 加4 char * 加1 double * 加8
12、存储位置:
常量区 存放一些常量字符串
堆 对象
栈 存放局部变量
13、指针与字符串
char *name = "it"; //字符串常量 常量字段不允许进行修改。 且name指向字符串的首字符。
1).定义字符串2种方式:
利用数组 char name[] = "itcast"; 特点 字符串里面字符可以修改
利用指针 char *name = "itcast"; 特点 字符串其实是一个常量字符串,里面的字符是不能修改的,被放到缓存中
2).指针数组(字符串数组):
char *name = {"jack", "rose"};
3).字符串输入:
char name[20];
scanf("%s", name);
4).返回指针函数
char *test(){ }; //返回char 类型指针的函数
5).指向函数的指针
void test(){printf("指向函数的指针")};
int main()
{
//(*p)是固定的写法,代表指针变量P将来肯定是指向函数
//左边的void 指针变量p指向的函数没有返回值
//右边的() 指针变量p指向的函数没有形参
void (*p) ();
//指针变量p指向了test函数
p = test;
//带用函数的方式 p代表的就是test
p();
(*p)(); //利用指针变量间接调用函数
test(); //直接调用函数
}