一、指针
1.指针是一个值为内存地址的变量
指针是一个变量,用来存放另一个变量的地址。
2.基本用法:
数据类型*指针变量名;
例如:
int* ptr_num;
charptr_name;
floatmoney_ptr;
doublep_price;
注意: 在头文件<stdio.h>中,NULL被定义为常量
intptr_num=NULL;
指针的初设值为空,表示指针不指向任何地址
3.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num = 7;
int * ptr_num=#
printf("num 变量地址是:%p\t%x\n",ptr_num,&num); //%p 指针占位符, %x 16进制占位符
return 0;
}
4.
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num1 = 1024;
int num2 = 2048;
int *ptr1;
int *ptr2;
ptr1 =&num1;
ptr2 =&num2;
printf("num1的值是%d\t num1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\t num2的地址是:%p\n",num2,ptr2);
//将变量1的值赋值给变量2
// *ptr2=*ptr1;与 num2=num1;等价
//直接操作指针
ptr2=ptr1;
printf("重新赋值后: \n");
printf("num1的值是%d\t num1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\t num2的地址是:%p\n",num2,ptr2);
*ptr2=11111;
printf("重新赋值后: \n");
printf("num1的值是%d\t num1的地址是:%p\n",num1,ptr1);
printf("num2的值是%d\t num2的地址是:%p\n",num2,ptr2);
return 0;
}
5.
一个变量就是一块内存空间,内存空间就是有地址。
指针同样是一个变量,只不过该变量中储存的是另一个是对象的内存地址;
如果一个变量储存另一个对象的地址,则称该变量指向这个对象。
指针变量可以赋值,指针的指向在程序执行中可以改变;
指针P在执行中某时刻指向变量X,在另一时刻也可以指向变量y
注意:
指针变量的命名规则和其他变量命名规则一样;
指针不能与现有变量同名;
指针可存放C语言中的任何基本数据类型,数组和其他所有高级数据结构的地址;
若指针已声明为指向某种类型数据的地址,则它不能用于存储其他类型数据的地址;
应为指针指定一个地址后,才能在语句中使用指针。
二、指针与数组
1.数组:
存储在一块连续的内存空间中
数组名就是这块连续内存空间的首地址
2.指针算数运算
指针的递增和递减++、–
3.
int num[50];//num是数组名,也是数组的首地址
num的值与&num[0]的值相同
数组第i+1个元素可表示为:
第i+1个元素的地址:&num[i]或num+i
第i+1个元素的值:num[i]或*(num+i)
为指向数组的指针赋值:
int*put_num=num;或int*put_num=&num[0];
指针变量可以指向数组元素
int*ptr_num=&num[4];或int*ptr_num=num+4;
#include <stdio.h>
#include <stdlib.h>
int main()
{
int array[]={15,12,13,45,55};
int i;
int *ptr_array= array;
//赋值完毕后,就可以使用指针访问数组元素
for(i=0; i<5;i++)
{
// printf("第%d个元素的值为%d\t地址为:%p\n",i+1,ptr_array[i],&ptr_array[i]);
//printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*(ptr_array+i),&ptr_array+i);
printf("第%d个元素的值为%d\t地址为:%p\n",i+1,*ptr_array,&ptr_array);
//每次循环都会移动指针,要注意重置
ptr_array++;
}
return 0;
}
5.
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main()
{
int array[N]={15,12,13,45,55};
//实现数组的逆序-数组首尾元素交换
int temp; //临时变量
int i;
for(i=0;i<N/2;i++)
{
//第i个值和第N-i-1个值互交换
temp = array[i];
array[i]=array[N-i-1];
array[N-i-1]=temp;
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%d\t",*(array + i));
}
6.
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main()
{
int array[N]={15,12,13,45,55};
//实现数组的逆序-数组首尾元素交换
int temp; //临时变量
int i;
int *ptr_array_start=array; //指向数组首地址的指针
int *ptr_array_end =array+N - 1; //指向数组末元素的指针
while(ptr_array_start != ptr_array_end)
{
//首尾交换,指针分别进行更新
temp=*ptr_array_start;
*ptr_array_start=*ptr_array_end;
*ptr_array_end=temp;
//首元素指着要向后移动
ptr_array_start++;
//末元素指针要向前移动
ptr_array_end--;
}
printf("\n");
for(i=0;i<N;i++)
{
printf("%d\t",*(array + i));
}
7.二维数组与指针
首地址:&a【0】【0】
使用指针访问二维数组中的元素
*(a[1]+2)
*(*(a+1)+2)
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main()
{
//数组名就是数组的首地址(数组元素首地址)
//二维数组的理解:1-是由n个一位数组所组成
int i, j;
double score[5][3]={
{51,76,77},
{53,46,97},
{54,26,37},
{57,16,67},
{55,96,87},
};
for(i=0;i<5;i++)
{
for(j=0;j<3;j++)
{
//printf("%.2lf\t",score[i][j]); //score[i]=>*(score+i)
printf("%.2lf\t",*(*(score+i)+j));
}
printf("\n");
}