一.概念:
*指针:
指针是个变量,存放内存单元的地址,也就是编号,存放在指针中的值都被当做地址处理。(在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储 器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为指针。意思是通过它能找到以它为地址的内存单元。)
*数组:
数组是一组相同类型元素的集合。
二.赋值、存储方式、求sizeof、初始化:
1. 初始化:
数组:数组的初始化是指在创建数组的同时给数组的内容一些合理的初始值。
int arr1[3]={1,2,3};
int arr2[]={1,2,3,4,}; //【】里默认为4
int arr3[]="abcd"; //此处的数组大小为5
int arr4[8]={1,2,3,4,5};
指针:
int a=10;
int *p=&a; //将a的地址存放在p变量中,p就是一个指针变量
2. 求sizeof:
数组:
数组所占存储空间的内存:sizeof(数组名)
数组的大小:sizeof(数组名)/sizeof(数据类型)
指针:sizeof(指针名)
在32位平台下,无论指针的类型是什么,指针的大小都是4
在64位平台下,无论指针的类型是什么,指针的大小都是8
3.font size=4> 存储方式:
数组:
数组在内存中是连续存放的。数组在栈上开辟一整块区域,这一整块内的数组元素依次从低地址到高地址存放。多维数组在内存中也是按照一维数组存储的,只是在逻辑上是多维的。
指针:
指针它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。
4.font size=4> 赋值:
指针:
同类型指针变量可以相互赋值,若类型不同则可以强制转换
数组:
数组只能一个通过数组的下标,将元素一个一个的的赋值或拷贝
三.传参
数组:
数组传参会发生降维,降维成指向其内部元素类型的指针。
(降维的意义:C语言只会以值拷贝的方式传递参数,参数传递时,如果拷贝整个数组,效率会大大降 低,并且在参数位于栈上时,太大的数组拷贝将可能会导致栈溢出)
指针:
1.当一个函数的参数部分为一级指针的时候,函数能够接受什么参数?(例如:test(int *p) )
---整型指针
---整型地址
---一维整型数组
2.当一个函数的参数部分为二级指针的时候,函数能够接受什么参数?(例如:test(int **p) )
---二级整型指针
---一级指针的地址
---指针数组
四、函数指针、函数指针数组、函数指针数组的指针
1.函数指针:
存放函数的入口地址
#include <stdio.h>
void test()
{
printf("hehe\n");
}
int main()
{
printf("%p\n", test); //函数名和&函数名都代表函数的地址
printf("%p\n", &test);
return 0;
}
输出的结果:
输出的是两个地址,这两个地址是 test 函数的地址
2.函数指针数组:
把函数的地址存到一个数组中,那么这个数组就叫做函数指针数组
int (*p[5])(); //函数指针数组的定义
3.函数指针数组的指针
指向函数指针数组的指针是函数指针数组
void test(const char* str)
{
printf("%s\n", str);
}
int main()
{
void (*p)(const char*) = test; //函数指针p
void (*pArr[5])(const char* str); //函数指针的数组
pArr[0] = test;
void (*(*ppArr)[10])(const char*) = &pArr; //指向函数指针数组pfunArr的指针ppfunArr
return 0;
}
五.一级指针
#include<stdio.h>
int main()
{
int a=5;
int *p=&a;
return 0;
}
六.二级指针
概念:指针变量也是变量,是变量就有地址,那么存放一级指针变量的地址的变量叫做二级指针。
int main()
{
int a=5;
int *p=&a;
int **pp=&p;
return 0;
}
*p代表a
**pp代表a
*pp代表p
七.指针数组
概念:指针数组是数组,是存放指针的数组
int *arr[5];
int* arr1[10]; //整形指针的数组
char *arr2[4]; //一级字符指针的数组
char **arr3[5]; //二级字符指针的数组
八.数组指针
概念:是指针,是指向数组的指针
int (*arr)[5];
//arr先和*结合,说明arr是一个指针,指向的是一个大小为5个整型的数组,因此arr叫做数组指针。
九.总结
1.数组只能被整体初始化,不能被整体赋值
2.多维数组也可以看做一位数组
3.多维数组只有第一个维度可以省略,因为若省略了,指针类型就不明确了
4.指针的类型type *
5.指针加1:加上其所指向类型的大小
6.两指针相减:代表两指针之间所经历的元素个数
7.只要传参就会形成临时变量
8.已初始化数据区和未初始化数据区是针对全局变量而言的
9.数组名表示数组首元素的地址
10.数组的元素个数也会参与数组的类型
11.赋值的前提是保证两边双方的类型是一致的
12.一般建议数组传参时候带上元素个数
13.CPU内部有一个PC指针,它是CPU内部的一个寄存器,里面存放当前正在执行指令的下一条指令的地址
14.浮点数可以随时进行比较,只是在比较两个数的差值和与0比较时有些特殊,要和相应的精度去比较
15.指针也是变量,它具有一切变量的属性,也在内存中存放,也可以开辟空间,也可以定义一个类型
16.在内存中,读写的基本单元为1个字节
17.强转改变的是你看待他的方式,它本身的值并没有发生改变
18.大小端问题:内存有高地址和低地址之分。数据有高权值位和低权值位之分。将数据的高位放在高地址处,地位放到低地址处就叫做小端
19.指针和数组是两个完全不同的概念,只是在使用时有重叠现象
20.任何符号,当其左右两侧都有操作符时,一般都先和右边的先结合。
21.sizeof数组名 , &数组名 代表的都是整个数组,其他别的情况都代表数组首元素的地址