指针与数组

1、数组是常量指针;

int a[]==int * const a;

说明:

(1)很okay

	int *p;
	int a[10085]={1,2,3,4,5};
	p=a;

(2)非常不okay

	int a[10085]={1,2,3,4,5};
	int b[10086];
	b=a;

2、数组名==数组的地址==数组首元素的地址

注意:数组地址(数组名前加&)与数组首元素地址(数组名)虽然数值上相同,但实际定义不同,运用时候也不同;

3、数组指针和指针数组:

(1)指针数组:

a.含义:指针的数组,即为存放指针的数组;

b.定义方法:

char *a[100];

 (2)数组指针:

a.含义:数组的指针,即为存放数组的指针,这个指针存放着一个数组的首地址(在数组名前加取地址符&),或者说这个指针指向一个数组的首地址;

b.定义方法:

char (*p)[100];

注:

p可以看作是char[4]类型的,a是char类型的,类型不同不能互相赋值。

p+1,p的地址会加上整个数组的长度,即地址会加上4;

a+1,a的地址只会加上1个char的字节大小,即地址只会加1; 

(3)样例:

char str[100]={'A','B','C','D','E'};

a.

char *pchar=&str[0];
char *pstr_1=str;

均能输出数组首元素字符(单个字符),又能根据数组首元素地址输出整个字符串,因为 str 是指向数组的首元素的指针是二者相同。

b.

char (*pstr_3)[sizeof(str)/sizeof(str[0])]=&str;

 不能输出单个字符,但能输出整个字符串,因为 &str 取得的是指向整个数组的指针;

4. malloc()和free()

(1)引入:

malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。

(2)malloc()功能:用于申请一块连续的指定大小的内存块区域以void*类型返回分配的内存区域地址;如果分配成功:则返回一个指针,指向一段可用内存的起始地址, 否则返回空指针NULL(空间有限,申请内存失败),同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。

(3)定义格式:

a.需要头文件

 #include<stdlib.h>

b.格式

对数组:(n为数组的大小,申请内存后a完全可以当作一个数组用)

type *a=(type*)malloc(n*sizeof(type));

对指针: 

type *a=(type*)malloc(sizeof(type));

注:因为malloc返回的是void*类型的变量,要进行类型转换;

关于:void *

表示未确定类型的指针。C,C++规定,void *类型可以强转为任何其他类型的的指针。

void * p1;
int *p2;
p1 = p2;  

 就是说其他任意类型都可以直接赋值给它,无需进行强转,但是反过来不可以。

(4)求电脑可分配内存的方法

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
	void *p=NULL;
	int cnt=0;
	while((p=malloc(100*1024*1024))){
		cnt++;
	}
    free(p);
	printf("分配了%d00MB的空间",cnt);
	return 0;
}

注:定义指针可以初始化为NULL; 

5.类型转换

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
	void *mem=malloc(1000);
	int *pint=(int*)mem;
	char *pchar=(char*)mem;
	double *pdouble=(double*)mem;
	
	pchar[0]='A';
	printf("%c\n",pchar[0]);
	printf("%d\n",pint[0]);
	printf("%lf\n",pdouble[0]);
	printf("----------------------------------\n");
	pint[0]=999;
	printf("%c\n",pchar[0]);
	printf("%d\n",pint[0]);
	printf("%lf\n",pdouble[0]);
	printf("----------------------------------\n");
	pdouble[0]=3.14;
	printf("%c\n",pchar[0]);
	printf("%d\n",pint[0]);
	printf("%lf\n",pdouble[0]);
	printf("----------------------------------\n");
	strcpy((char*)mem,"ABCDEFG");
	printf("%c\n",pchar[0]);
	printf("%s\n",pchar);
	return 0;
}

6、const对于指针的定义;

说明:

(1) 

a.非常不okay

#include<stdio.h>
int main(void)
{
	int b=10;
	const int *a=&b;
	*a=26;
	printf("%d",*a);
}

b.非常okay

#include<stdio.h>
int main(void)
{
	int b=10;
	int c=11;
	const int *a=&b;
	a=&c;
	printf("%d",*a);
}

(2)

a.非常不okay

#include<stdio.h>
int main(void)
{
	int b=10;
	int const *a=&b;
	*a=26;
	printf("%d",*a);
}

b.非常okay

#include<stdio.h>
int main(void)
{
	int b=10;
	int c=11;
	int const *a=&b;
	a=&c;
	printf("%d",*a);
}

(3)

a.非常不okay

#include<stdio.h>
int main(void)
{
	int b=10;
	int c=11;
	int *const a=&b;
	a=&c;
	printf("%d",*a);
}

b.非常okay

#include<stdio.h>
int main(void)
{
	int b=10;
	int *const a=&b;
	*a=26;
	printf("%d",*a);
}

总结:

若 const 离 int 更近,表明指针可以指向别的变量,但是不能通过指针去修改这个指针所指向的变量。eg. (1)和(2)

若 const 离 a 更近,表明可以通过指针去修改这个指针所指向的变量,但是不可以指向别的变量。eg. (3)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值