黑马程序员-C语言基础学习(五)

来源:互联网 发布:淘宝提交多个订单 编辑:程序博客网 时间:2024/05/16 19:32

---------------------- 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个字节的存储空间。


10、指针与数组
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();  //直接调用函数
}
0 0