第八章 指针
8.1 指针
定义:
若在程序中定义了一个变量时,在编译时,系统会给变量分配内存单元。
编译系统根据程序中定义的变量类型,分配一定长度的空间 。
内存区的每一个字节有一个编号,即地址,地址指向该变量单元,又称为指针。
数组的性质:
空间有序;单元连续;类型一致 // int a[10];sizeof(&a+1) - sizeof(&a) = 40 bytes
//int a;sizeof(&a+1) - sizeof(&a) = 4 bytes
内存错误 in C:
int a;scanf("%d",a);
数组越界
指针变量未指向合法内存
By the way:
All addresses are unsigned int.
& and * 互为逆运算.
8.2指针变量
定义:
存放指针的变量。
基类型 *指针变量名:
基类型是指针指向变量的数据类型(基本数据类型,指针型,void 型,构造类型)(sizeof(基类型*) = 4)
指针变量在定义时需初始化,否则为野指针,指向垃圾内存。
0 in different form:
'\0' , 0 , NULL , 1E-5 , false match with the type of char , int, 基类型*,double or float , bool。
性质:
指针变量的属性(unsigned int);&*运算互逆;指针变量与指针所指对象的区别与操作。
指针变量与函数参数。
指针变量位移律:指针变量的类型决定单位位移的字节数。
利用指针输出数组元素。
不同基类型的指针可操作不同字节的内容。
*p:从p所指的地址开始,以p的基类型所占的字节数为偏移量,取当前这段内存空间里面的内容。
8.3通过指针引用数组
逆序
排序
{ int *const p1 //p1不可写
int const * p2 //p2所指向的内容不可写
const int * p3 //p3与p2类型等价
const int * const p4 //p4和p4的指向均不可写
}
{
void *malloc(size_t size)//返回空间连续
void *realloc(void * memblock,size_t size)//返回空间连续
}
{
*(++p),*(p++),(*p)++,*p++ 的区分;
}
{ int a[M][N] , i , j ; a( int ( * ) [N] ), a[i] (int *) ,a [i][j] (int);
}
{ int (*p)[n];int *q; p = a;q = a;
*(*(p + i) + j) == *(q + i * n +j) == a[i][j]; //数组指针(指向数组的指针,即行指针),指针数组(数组元素类型为指针型的数组)
a[i][j] == *(a[i]+j) ==*(*(a+i)+j);
}
{
函数返回值类型 (*p)(参数列表)
int (*p)(int,int) ;
int max(int,int);
p = max;
p(int,int) == max(int,int);//函数指针 (指向函数的指针),指针函数(函数返回值类型为指针型的函数)
int (*p[5])(int,int) //函数指针数组(元素类型为函数指针型的数组)
int(*fun(int n))(int ,int)//函数指针函数(返回值类型为函数指针型的函数)
返回指向栈内存(局部空间)的指针非法;
return 指针合法的两种情况:1 在main()中申请空间,作为子函数的实参,返回该空间;
2子函数里,调用malloc(),返回该空间,不再需要时调用free();
}
8.4字符串与指针
1 将一个字符串赋值给字符指针变量时,指针指向字符串常量的首地址。
2 char *p = "sasdas"; //*p无w权限。
3字符串常量的地址位于内存常量区,也是*p无权限的原因。
4 char a[3][80];
char *p[3] = {"123","aSAAS","dsasd"};//字符串个数已确定,长度不定,使用指针数组。
char(*q)[80] //字符串个数不定,长度已确定,使用数组指针。
8.5 变量,一维数组,二维数组,函数与指针的联系
{
int a;
int b[N];
int c[M][N];
int fun(int);
int *p1; p1 = &a ,b ,&b[0],b + i,c[i] + j,&c[i][j],*(c+i) + j; //指针变量
int (*p2)[N]; p2 = &b, c + i,&c[i]//数组指针
int *p3[N]; p3[i] <=> p1 //指针数组
int **p4; p4 = &p3[i]//二重指针
int (*p5)(int); p5 = fun;fun() == p5();// 函数指针
int *p6(int); p1 = p6; //指针函数
int (*p7[N])(int); p7[i] <=> p5// 函数指针数组
}
8.6
{
main()传参,project settings/Debug;
子函数形参数组名被编译为指针变量;
mymalloc();
swap();
}
8.1 指针
定义:
若在程序中定义了一个变量时,在编译时,系统会给变量分配内存单元。
编译系统根据程序中定义的变量类型,分配一定长度的空间 。
内存区的每一个字节有一个编号,即地址,地址指向该变量单元,又称为指针。
数组的性质:
空间有序;单元连续;类型一致 // int a[10];sizeof(&a+1) - sizeof(&a) = 40 bytes
//int a;sizeof(&a+1) - sizeof(&a) = 4 bytes
内存错误 in C:
int a;scanf("%d",a);
数组越界
指针变量未指向合法内存
By the way:
All addresses are unsigned int.
& and * 互为逆运算.
8.2指针变量
定义:
存放指针的变量。
基类型 *指针变量名:
基类型是指针指向变量的数据类型(基本数据类型,指针型,void 型,构造类型)(sizeof(基类型*) = 4)
指针变量在定义时需初始化,否则为野指针,指向垃圾内存。
0 in different form:
'\0' , 0 , NULL , 1E-5 , false match with the type of char , int, 基类型*,double or float , bool。
性质:
指针变量的属性(unsigned int);&*运算互逆;指针变量与指针所指对象的区别与操作。
指针变量与函数参数。
指针变量位移律:指针变量的类型决定单位位移的字节数。
利用指针输出数组元素。
不同基类型的指针可操作不同字节的内容。
*p:从p所指的地址开始,以p的基类型所占的字节数为偏移量,取当前这段内存空间里面的内容。
8.3通过指针引用数组
逆序
排序
{ int *const p1 //p1不可写
int const * p2 //p2所指向的内容不可写
const int * p3 //p3与p2类型等价
const int * const p4 //p4和p4的指向均不可写
}
{
void *malloc(size_t size)//返回空间连续
void *realloc(void * memblock,size_t size)//返回空间连续
}
{
*(++p),*(p++),(*p)++,*p++ 的区分;
}
{ int a[M][N] , i , j ; a( int ( * ) [N] ), a[i] (int *) ,a [i][j] (int);
}
{ int (*p)[n];int *q; p = a;q = a;
*(*(p + i) + j) == *(q + i * n +j) == a[i][j]; //数组指针(指向数组的指针,即行指针),指针数组(数组元素类型为指针型的数组)
a[i][j] == *(a[i]+j) ==*(*(a+i)+j);
}
{
函数返回值类型 (*p)(参数列表)
int (*p)(int,int) ;
int max(int,int);
p = max;
p(int,int) == max(int,int);//函数指针 (指向函数的指针),指针函数(函数返回值类型为指针型的函数)
int (*p[5])(int,int) //函数指针数组(元素类型为函数指针型的数组)
int(*fun(int n))(int ,int)//函数指针函数(返回值类型为函数指针型的函数)
返回指向栈内存(局部空间)的指针非法;
return 指针合法的两种情况:1 在main()中申请空间,作为子函数的实参,返回该空间;
2子函数里,调用malloc(),返回该空间,不再需要时调用free();
}
8.4字符串与指针
1 将一个字符串赋值给字符指针变量时,指针指向字符串常量的首地址。
2 char *p = "sasdas"; //*p无w权限。
3字符串常量的地址位于内存常量区,也是*p无权限的原因。
4 char a[3][80];
char *p[3] = {"123","aSAAS","dsasd"};//字符串个数已确定,长度不定,使用指针数组。
char(*q)[80] //字符串个数不定,长度已确定,使用数组指针。
8.5 变量,一维数组,二维数组,函数与指针的联系
{
int a;
int b[N];
int c[M][N];
int fun(int);
int *p1; p1 = &a ,b ,&b[0],b + i,c[i] + j,&c[i][j],*(c+i) + j; //指针变量
int (*p2)[N]; p2 = &b, c + i,&c[i]//数组指针
int *p3[N]; p3[i] <=> p1 //指针数组
int **p4; p4 = &p3[i]//二重指针
int (*p5)(int); p5 = fun;fun() == p5();// 函数指针
int *p6(int); p1 = p6; //指针函数
int (*p7[N])(int); p7[i] <=> p5// 函数指针数组
}
8.6
{
main()传参,project settings/Debug;
子函数形参数组名被编译为指针变量;
mymalloc();
swap();
}