C、C++指针、数组和内存分配

指针表示的是变量的地址与值的关系:

指针的定义:int *p;//指向整型变量的指针;
struct POINT{int x,y}  POINT *P;
typedef int * PINT; //使用PINT代替int *
PINT p,q; //定义了两个指向整型的指针变量p,q;
指针变量指向变量的地址;
1.指向变量的指针
int *p; p = &n;  等同于 int *P  = &n;
2.指向数组的指针
int  a[] = {1,2,3,4,5,6,7,8,9};
int *p = a;
数组中a表示是首地址,当然也可以是 &a,或者&a[0];
3.引领操作符
int m,n= 10;  int *q = &n; m = *q;
void swap(int *x ,int *y)
   {
    int t;
     t= *x;
    *x = *y;
    *y = t;
   }

2、常量指针与指针常量
常量指针:
1、  int n = 10;
  const int *p = &n; //不能通过之指针改变目标独对象的值,但是可以改变指针指向;
2、void PrintObject(const int *p)
常量指针,不能通过指针修改数值;
指针常量:
int  n= 10;int *const p = &n;
//定义式必须初始化。
3、指向常量的指针常量
  const int * const p = &n;
4、指针可以最为函数的返回值,只能返回全局变量的指针;
/
1.指针与数组的关系
int a[8] = {1,2,3,4,5,6,7,8};
数组基地址:&a,a;
数组元素地址:&a[0] + i*sizeof(int);
也可以写为: a+ i*sizeof(int);
例子:
int *p = &a[5];
p+2 指向&a[7];
p-2  指向&a[3];
指针关系运算:
设P,q为指针 ( p==q )?指针是否指向同一个地址;(P==NULL);是否为空指针;
2、作为函数参数时的指针与数组
数组形式的:
void generate(int a[],unsigned int n)
  {
   unsigned int i;
   randmize();
   for(i=0;i<n;i++)
   a[i] = GenerateRandomNumber(10,99);
   }
指针形式的:
void generate(int *p,unsigned int n)
  {
   unsigned int i;
   randmize();
   for(i=0;i<n;i++)
   *p++ = GenerateRandomNumber(10,99);
   }
//*p++表示后加,执行完该语句后才加1;

3、指针与结构体
struct ARRAY{
unsigned int count;
int * elements;
}
int a[8] = {};
访问elements的第i个元素:array.elements[i]
Array * parry;
(*parray).elements[i]或者parray->elements.[i];
why:静态与自动内存分配必须事先了解数据对象的格式和存储空间的大小,部分场合无法确定数据对象的大下。
示例:声明一个包含n个元素的整数数组,n由用户动态输入决定。
头文件:“cstdlib”、“cmalloc”两者包含一个即可
开辟内存: void *malloc(unsigned int size);
释放内存: void  *free(void * memblock);

char *p;
p = (char *)malloc(10);
分配是个字符变量的空间;
编写函数,复制字符串
char *DuplicateString(char *s)
{
char *t;
unsigned int n,i;
n = strlen(s);
t  = (char *)malloc(n+1);
for(i=0;i<n;i++)
t[i] = s[i];
t[i+1]  = '\0';
return t;
}

销毁存储空间
free(p) ; p = NULL;
int *p  =(int *) malloc(10*sizeof(int)); free(p);
char *p; p =(char *)malloc(11); free(p);
两种方法都可以;

C++中提供了new、delete操作函数来管理动态内存;

动态创建单个目标对象:
int *p; p = new int; *p =10;
int *p; p = new(int); *p =10;
int *p ; p =new int (10);
int *p ; p =new (int )(10);

动态创建多个目标对象:
int *p ; p =new int[8];

释放单个目标对象
int *p; p = new int; *p =10;  delete  p;

释放多个目标对象
int *p ; p =new int[8]; delete[]  p;
指针使用的一般原则;
主动释放原则:函数分配了内存,退出钱一定要主动释放;不需要是也要主动释放;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值