指针进行运算时,要确保指针说指向的内存区域一致
比如 指向不同数组的两个指针,进行运算得到的结果没有意义.
数组指针:
将数组名作为参数传递给函数时,实际上是传递的数组的首地址.
函数的形参可以写成以下形式:
void f(int a[10])
或void f(int a[])
或void f(int *a)
定义的格式: int (*变量名)[数组列数]
int a[10], *p = a;
int b[10][10], (*p2)[10] = a;
如果要传二级指针:
void f(int (*p)[10]);
void f(int a[10][10]);
一、 指针常量:int const *p;或者是 const int *p;指针指向的对象是常量,那么这个对象不能被更改。
int a = 5;
const int b = 8;
const int *c = &a; // 这是合法的,非法的是对c的使用
*c = 6; // 非法,但可以这样修改c指向的对象的值:a = 6;
const int *d = &b; // b是常量,d可以指向b,d被赋值为b的地址是合法的
二、常量指针:int *const p;指针常量的值是指针,这个值因为是常量,所以不能被赋值。
char *a = "abcde1234";
char *b = "bcde";
char *const c = &a;
下面的操作是可以的。
a[0] = 'x'; // 我们并没有限制a为常量指针(指向常量的指针)
或者
*c[0] = 'x' // 与上面的操作一致
三、指针常量的指针常量;指向常量的指针常量就是一个常量,且它指向的对象也是一个常量。
char *a = "abcde1234";
const char *b = "bcde"; // b是指向常量字符串的指针变量
char *const c = &a; // c是指向字符指针变量的常量
const char *const d = &b; // d是指向字符常量的指针常量
四、指针的偏移
void test(int *p1, char *p2, double *p3, short *p4)//取地址
{
int i;;
for (i = 0; i < 5; i++)
{
printf("%p %p %p %p", p1++, p2++, p3++, p4++);
getchar();
}
}
int main()
{
int a[5] = { 1 };
char b[5] = { 0 };
double c[5] = { 0 };
short d[5] = { 0 };
test(a, b, c, d);
getchar();
}
指针偏移会根据指针数组的类型为长度进行偏移
int a[n], 则a是一个数组类型,而不是int型了,要注意正确对待。
a与&a的值一样,但意义不一样, a+1的偏移量为一个int,相当于&a[0], &a+1的偏移量为真个数组。是数组类型的指针
malooc函数:叫动态内存分配
如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
关于该函数的原型,在以前malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
realloc函数:原型是extern void *realloc(void *mem_address, unsigned int newsize);
指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。
新的大小可大可小(如果新的大小大于原内存大小,则新分配部分不会被初始化;如果新的大小小于原内存大小,可能会导致数据丢失 )
如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
当内存不再使用时,应使用free()函数将内存块释放。