灵魂拷问:你分得清数组指针,指针数组,和指向指针的指针吗???
关键词:指针,数组
如果你对指针的的了解懵懵懂懂,比如&,*到底是什么,怎么用,指针怎么对一维,二维数组来访问并且进行操作,这篇文章给你答案。
一、指针是什么?
指针也就是内存地址,指针变量是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
将百度的话翻译一下(说人话): (1)指针大小会变吗? 你的计算机如果是32位的,不管是
int *a;
char *b;
double *c;
它们是32/8=4Byte【一个字节(Byte)占8位(bit)】 例如:我的计算机是64位的,自己可以使用函数sizeof()来查看其大小
int *a;
char *b;
double *c;
cout<<sizeof(int *)<<"\n";
cout<<sizeof(b)<<"\n";
(2)他和老搭档&怎么用?
int a=1;
此时a的值为1,就对a直接进行操作就可。
要知道: &在C语言中表示取地址符。
int a;
scanf("%d",&a);
就是对取到变量a的地址后,才能将值输入进去。 基于取地址的思想,C语言提供了指针 要知道:* 在C语言中有两个用法 ①命名或者作为子函数形参时,表示用于指向地址
int *a;
int b=5;
void BTLC(int *c)
main(){
BTLC(b)
正确写法:BTLC(&b)
}
②在函数内时,表示四则运算或者表示取到指针所指的地址的存储的值
1*2=3
void BTLC(int *c){
*c++
正确写法:(*c)++
当然指针也是变量,它也有地址
int *p;
int **q;
q=&p
}
二、使用
1.和一维数组结合
【注意】
int a[5]={1};
int *p;
p=a;
*(p+i)=p[i]
代码如下(示例):
#include <iostream>
using namespace std;
#define Maxsize 5
void add_1(int *p){
int sum=0;
for (int i = 0; i < Maxsize; ++i) {
sum+=1;
*(p+i)=sum;
}
}
void add_2(int *p){
int sum=0;
for (int i = 0; i < Maxsize; ++i) {
sum+=1;
p[i]+=sum;
}
}
void Print(int a[]){
for (int i = 0; i < Maxsize; ++i) {
cout<<a[i]<<"\t";
}
cout<<endl;
}
int main(){
int a[Maxsize]={0};
add_1(a);
Print(a);
add_2(a);
Print(a);
}
2.和二维数组结合
【重点来了】
【注意】
int a[5][5];
int *p;
*(p+i)=p[i]
*(*(p+i)+j)=p[i][j]
指针数组
#include <iostream>
using namespace std;
#define Maxsize 5
void add_1(int a[][Maxsize]){
int sum=0;
int *p[Maxsize];
for (int i = 0; i < Maxsize; ++i) {
p[i]=a[i];
for (int j = 0; j < Maxsize; ++j) {
sum+=1;
p[i][j]=sum;
}
}
}
void Print(int a[][Maxsize]){
for (int i = 0; i < Maxsize; ++i) {
for (int j = 0; j < Maxsize; ++j) {
cout<<a[i][j]<<"\t";
}
cout<<"\n";
}
cout<<endl;
}
int main(){
int a[Maxsize][Maxsize]={0};
add_1(a);
Print(a);
}
【数组指针】
#include <iostream>
using namespace std;
#define Maxsize 5
void add_2(int a[][Maxsize]){
int sum=0;
int (*p)[Maxsize];
for (int i = 0; i < Maxsize; ++i) {
p=&a[i];
for (int j = 0; j < Maxsize; ++j) {
sum+=1;
*(*(p)+j)=sum;
}
}
}
void Print(int a[][Maxsize]){
for (int i = 0; i < Maxsize; ++i) {
for (int j = 0; j < Maxsize; ++j) {
cout<<a[i][j]<<"\t";
}
cout<<"\n";
}
cout<<endl;
}
int main(){
int a[Maxsize][Maxsize]={0};
add_2(a);
Print(a);
}
3.递归对某一值重复操作
递归在数据结构中,尤其是树中,图中有着大量的应用 代码如下(示例):
void Knots(BitTree T,int *c){
if (T){
(*c)++;
Knots(T->lchild,c);
Knots(T->rchild,c);
} else return;
}
或者
int count=0;
void Knots(BitTree T,int *c){
if (T){
(*c)++;
Knots(T->lchild,&count);
Knots(T->rchild,&count);
} else return;
}
Knots(T,&count);
总结
以上就是今天要讲的内容,本文仅仅简单介绍了指针以及数组的结合使用,后续将继续补充C语言中的常见问题。
不足之处,欢迎讨论。
|