c语言基础——指针(一)

  • 数组作为函数参数传递,在函数内部改变数组的值,是会最终改变数组的值的
  • 当需要在函数内改变指针指向的内存块时,需要使用指向指向的指针作为函数参数,才能改变指针的指向

指针

  • 虚拟内存和指针

    每个程序都假定自己能够访问机器的整个物理内存空间,实际上却不是。程序使用的地址是虚拟地址。操作系统会在需要时把虚拟地址映射为物理地址。应用程序的虚拟地址不会变,就是我们在查看指针内容时看到的地址。操作系统会帮我们将虚拟地址映射为真实地址。

  • 数组指针
    例如 int (*p)[10],这是一个数组指针,指向一个一维整形的数组,这个数组的长度是10,也就是说当p+1时,p要跨过10个整型数据的长度
    数组指针也称为行指针,将二维数组赋值给一个指针时,该指针就是行指针
    例如:

int num[4][5];
int *p[5];//该语句是定义一个数组指针,指向含5个元素的一维数组。
p=num;//将该二维数组的首地址赋给p,也就是num[0]或num[0][0]
p++;  //该语句执行过后,也就是p=p+1;p跨过行num[0][]指向了行num[1][]
  • 指针数组

    指针数组,由指针组成的数组。
    例如,int *p[10],表示声明了包含10个指向整形的指针的数组,这里执行p+1的时候,表示指向数字中的下一个元素,也就是下一个指针(因为该数组里的元素是指针)。

    数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。

  • 结构体与指针

    结构体分配内存:为结构体实际分配的内存通常会大于各字段的长度的总和,因为结构体各个字段之间可能会有填充,某些字段需要对齐到特定的边界就会产生填充。比如short int通常对齐到能被2整除的地址上,int通常对齐到能被4整除的地址上。

    结构体中的指针:在为结构体分配内存的时候,不会为结构体中的指针分配内存,当结构体消失时,系统也不会自动释放结构体中指针指向的内存。

    在结构体中分配内存:当需要改变结构体中指针指向的内存空间时,需要使用指向指针的指针。噢,刚才发现也不需要指向指针的指针,就指针就可以改变指向的空间了,我觉得应该是函数参数是引用的原因。代码在后面。蠢死我了
    代码如下

#include<iostream>
#include<malloc.h>
using namespace std;
struct kmer{
	int **k;
};
void init(struct kmer &K)
{
	int *tem;
	tem = (int*)malloc(sizeof(int)*10);
	for(int i=0;i<10;i++)
	{
		tem[i] = i;
	}
	K.k = &tem;
}
void change(struct kmer &K)
{
	int *tem;
	tem = (int*)malloc(sizeof(int)*10);
	for(int i=0;i<10;i++)
	{
		tem[i] = i+1;
	}
	K.k = &tem;
} 
void print(struct kmer K)
{
	for(int i=0;i<10;i++)
	{
		cout<<(*K.k)[i]<<' ';
	}
	cout<<endl;
}
int main()
{
	struct kmer K;
	init(K);
	print(K);
	change(K);
	print(K);
	return 0;
 } 

代码

// 结构体.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include<iostream>
#include<malloc.h>
using namespace std;
struct kmer {
	int *k;
};
void init(struct kmer &K)
{
	int *tem;
	tem = (int*)malloc(sizeof(int) * 10);
	for (int i = 0; i < 10; i++)
	{
		tem[i] = i;
	}
	K.k = tem;
}
void change(struct kmer &K)
{
	int *tem;
	tem = (int*)malloc(sizeof(int) * 10);
	for (int i = 0; i < 10; i++)
	{
		tem[i] = i + 1;
	}
	K.k = tem;
}
void print(struct kmer &K)
{
	for (int i = 0; i < 10; i++)
	{
		cout << K.k[i] << ' ';
	}
	cout << endl;
	free(K.k);
}
int main()
{
	struct kmer K;
	init(K);
	print(K);
	change(K);
	print(K);
	return 0;
}

运行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值