C-eighth

20181108 C-eighth

指针:就是一个地址。
指针变量:是一个特殊的变量,里面存放的是另外一个变量的地址。

int a[10]	 a(int*) 		a[i](int)

基类型 *指针变量名

printf("%d\n",sizeof(int*));
printf("%d\n",sizeof(char*));
printf("%d\n",sizeof(long*));
printf("%d\n",sizeof(double*));
printf("%d\n",sizeof(short*));
printf("%d\n",sizeof(float*));
这些值全是4;看的是值中的基类型;
int a = 5;
int *p = &a;
printf("%d\n",p);
printf("%d\n",p + 1);
printf("%d\n",(double*)p + 1);
printf("%d\n",(short*)p + 1);
加1就是加一个单元,看前面的基类型

野指针:不是NULL指针,指向垃圾内存的指针。
1.声明没初始化
2.malloc
3.free或delete后,没有将它置空
(malloc free)(new delete)

int *p = NULL;
int a = 5;
p = &a;
printf("%d\n",*p);
printf("%d\n",p);
printf("%d\n",&a);
p是一个指针,自己有地址就是a的地址。所指向的值就是a值。

关于交换值(swap)的共有四种方法:
1.交换不同内存单元的值。值不变
2.交换同一内存单元的值。值改变
3.单单指向改变。并不改变值
4.引用(一值二名称),改变的是二者的位置,值改变(地址同样改变)

void swap(int &x,int &y)
{
	int t = x;
	x = y;
	y = t;
}
void main()
{
	swap(a,b);
}
一值二名称;&a = x,&b = y;
int a = 6;
const int *p1 = &a;
int const *p1 = &a;
int *const p3 = &a;
const int *const p4 = &a;
此类情况需要看const和*位置的关系,当const在*之前时,指针为常量不能改变,反之,则仅仅是值为常量,不能改变,而指针可以改变。

堆:程序员自己开辟

int *p = NULL;
p = (int*)malloc(sizeof(int));
*p = 7;
printf("%d\n",*p);
free(p);
p = NULL;
这里free(p)是把p的内存重新还原。
realloc(是把空间开辟到,或者减少到)
p = (int*)realloc(p,sizeof(int)*2);

*p(取内容):从当前p所指向的首地址开始,以p的基类型所占的字节数为偏移量,取其中的内容。

char a[5] = {1,1,1,1,1};
int *p = (int*)a;
short *q = (short*)a;
printf("%d\n",*p);

数组的输出方法:(5种)

int *p = NULL;
int a[] = {1,2,4,5,7,8,9};
p = a;
int i;
for(i = 0;i < 10;i++)
	printf("%d ",a[i]);
for(i = 0;i < 10;i++)
	printf("%d ",*(a + i));
for(i = 0;i < 10;i++)
	printf("%d ",*(p + i));
for(i = 0;i < 10;i++)
	printf("%d ",p[i]);
for(p = a;p < a + 10;p++)
	printf("%d ",*p);
int a[5] = {1,2,3,4,5};
int *p = (int*)(&a + 1);
printf("%d,%d",*(a+1),*(p - 1));
一维数组a加1相当于a[0] + 1 = a[1];
此值是2 和 5
a取地址+1相当于二维数组,或者一维数组末尾元素,再减一为5;
int a[3][4];
printf("%d\n",a);
printf("%d\n",a + 1);
printf("%d\n",a[0]);
printf("%d\n",a[o] + 1);
a + 1相当于加了一行
a 和a[0]地址一样但是意思不一样,a代表首元素地址是个数组,然而a[0]仅仅代表首元素。

从标准输入读取一列整数,并将其存放在一个动态开辟的数组中,数组的第一个元素是这些整数的个数。

#define N 10
int size = N;
int *p = (int*)malloc(sizeof(int) * (size + 1))//多开辟一个
int n = 0;
int a;
while(1 == scanf("%d",&a))
{
	n++;
	if(n > size)
	{
		size = size + N;
		p = (int*)realloc(p,sizeof(int) * (size+1));
	}
	p[n] = a;
}
p = (int*)realloc(p,sizeof(int)*(n + 1));
p[0] = n;
for(int i = 0;i <= n;i++)
	printf("%d ",p[i]);
printf("\n");
free(p);
p = NULL;
重新开辟空间时,尽量开辟够用的即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值