12月13号指针数组笔记





指针进行运算时,要确保指针说指向的内存区域一致
比如 指向不同数组的两个指针,进行运算得到的结果没有意义.




数组指针:
将数组名作为参数传递给函数时,实际上是传递的数组的首地址.




函数的形参可以写成以下形式:
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()函数将内存块释放。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值