1、指针与数组
1)指针与一维数组
i.数组指针(指向数组元素的指针)
类型 *指针变量名;
指针定义完成后要初始化(不想让指向任何内容,=0,=NULL)
int a[10];
int *p = &a[0]; // &a[0] == a
int *p1 = a;
ii.用数组的指针访问数组元素
偏移:指针变量的偏移
p1 = p1+1; //向下偏移1个一个数组元素
p1++; //p1中存放的还是地址
....
如果用指针访问第i个元素 p1+i
取出pi指向的元素的值:*(p1+i); == a[i]元素的值
具体地址值计算:p1+sizeof(数组的类型)
指针数组(数组中的每个元素都是指针)
数组中的每一个元素还是一个指针
int a[3][3]={11,2,3,4,5,6,7,8,9};
a[0] //行地址
a[1]
a[2]
//pa就是一个指针数组
int *pa[3]={a[0],a[1],a[2]};
2)指针与二维数组
数组指针(指向数组元素的指针)
特定的格式:
int (*p3)[3]; //定义一个指向二维数组的指针,而且二维数组的第二维长度要是3
int b[3][3];
p3 = b;
int b1[2][3];
p3 = b1;
int b2[2][2];
p3 = b2; //编译器给警告
用指针对二维数组的遍历
int a[3][3] ={1,3,3,2,3,4,5,6,6};
int (*p1)[3] = a;
0 1 2
a[0]+0 a[0]+1 a[0]+2
a[0] 1 3 3
a[1] 2 3 4
a[2] 5 6 6
一维数组中: *(p1+0) = a[0]的值
*(a[0]+1)
*(*(p1+0)+1) == a[0][0] 元素的值
求a[i][j] = *(*(p1+i)+j)
指针数组(数组中的每个元素都是指针)
char *name[3][5]={"aaa","bbbb","cccc"};
2、字符数组与字符串指针
char 数组名[10];
c语言中没有字符串变量,字符串都是通过数组来存储的
char a[10]="xxxx"; //数组长度10,字符串的长度5(sizeof),strlen值4
//字符串指针
char *str ="azaaa";
字符数组和字符串指针的区别
1)字符数组,由数组元素组成,char c[5];c[5]='b'; 存到栈区
2)字符串指针他只存放了字符串的首地址,存放到常量区
3)字符串指针来说
char *s;
s = "hello";
char ch[5];
ch[5]="aa"; //错误的
3、补加的输入输出函数
scanf gets(不安全的) puts
fgets(指针,n,stdin); //安全的,
//从键盘接收字符串,放到指针指向的地址,如果字符串长度大于了n,这个时候只接收的字符串长度是:n-1,最后一个自动设置为'\0'
fputs(指针,stdout);
//输出现实
4、const修饰变量和指针
int const *p //值不能变,指向可变
const int *p //同上
int * const p;//指向不可变,值可变
const int * const p; //值和指向都不能变
5、动态内存分配
内存的分区:
代码区 编译产生的二进制代码
数据区 程序需要交换的数据
常量区 常量 字符串常量
堆区 程序运行的过程中动态申请的内存
栈区 局部变量存储
动态的内存申请:
程序运行的过程中向堆区动态申请一块内存区域
void* malloc(n) //从内存的堆区中申请n个字节内存
void* 空指针类型
存储整数
//申请了一个4个字节长度的内存区域,首地址放到了p中
int *p =(int *)malloc(4);
char *p1 =(char *)malloc(4);
float *p2 = (float *)malloc(4);
向内存单元中存储内容:
*p = 10;
来源:https://www.cnblogs.com/houzhitong/p/4499824.html