- 数组作为函数参数传递,在函数内部改变数组的值,是会最终改变数组的值的
- 当需要在函数内改变指针指向的内存块时,需要使用指向指向的指针作为函数参数,才能改变指针的指向
指针
-
虚拟内存和指针
每个程序都假定自己能够访问机器的整个物理内存空间,实际上却不是。程序使用的地址是虚拟地址。操作系统会在需要时把虚拟地址映射为物理地址。应用程序的虚拟地址不会变,就是我们在查看指针内容时看到的地址。操作系统会帮我们将虚拟地址映射为真实地址。
-
数组指针
例如 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;
}
运行结果