指针:能够操作内存空间,控制硬件,具有指向的特点
指针与地址的区别和含义:
地址:用来区分不同字节的编号
指针:指针就是地址,地址就是指针,指针具有指向的作用
指针变量:变量中储存的指针 eg: int *p
&运算符和*运算符:
&:获得一个变量的内存空间的首地址 eg:如上图所示,int a 的首地址就为0x2000
注意: 只有变量能够取地址,常量以及常量表达式都不能够取地址
*:获取对应空间中的值
注意:*指针 作为右值是取指针对应空间中的值
eg: *p = 100;(将100赋值给p所指向的空间)
*指针 作为左值是将指针右边的值赋值到指针所指向的空间
eg : num = *p (将p所指向的空间的值赋给num)
指针变量:
定义形式: 数据类型 *变量名;
eg : int *p ;
char *p ;
double *p;
float *p;
short *p;
内存形式: 所有类型的指针占8个内存 eg : sizeof(*p);
指针变量的操作:间接访问内存空间,并且对其进行操作,进行改变赋值等;
直接访问:通过变量名访问变量空间;
间接访问:通过变量在内存中的地址访问变量空间;
指针变量的初始化:
指针变量如果不初始化,其就为一个野指针
野指针:就是一个被释放的空间或者是一个随机的空间
int *p = NULL;
char *q = NULL;
指针算数的运算:
++(指针+1 ):向内存高地址偏移指向数据类型大小个字节空间
eg : *(p+1) *(p++) 因为*运算符较高,所以需要带括号
--(指针-1):向内存低地址偏移指向数据类型大小个字节空间
指针和数组:
eg: int a[5];
int *p = NULL;
p = a;(相当于 p = &a[0])
数组的数组名是指向数组第一个元素的指针常量
数组的访问形式: a[n]==*(a+n)==*(p+n)==p[n]
指针的字符型数组的关系
数组的数组名是指向数组第一个元素的指针
eg : char a[32] = {"hello world "};
char *p = NULL;
p = a ;
while (*p != 0)
{
p++;
}
练习:
从终端接收两个数,并定义两个指针分别指向这两个数,利用指针对两个数操作实现四则运算结果的打印
#include <stdio.h>
int main (void)
{
int a = 100 ; int b = 200 ;
int *p = NULL; int *e = NULL;
int num1 = 0 ; int num2 = 0;
int num3 = 0 ; int num4 = 0;
p = &a ; e = &b ;
num1 = *p + *e ;
num2 = *p -*e ;
num3 = *p * *e ;
num4 = *p / *e ;
printf("num1=%d\n",num1);
printf("num2=%d\n",num2);
printf("num3=%d\n",num3);
printf("num4=%d\n",num4);
return 0 ;
}
2.编写一个程序利用指针间隔打印"Computer Science"
输出为:Cmue cec
#include <stdio.h>
int main (void)
{
char a[32] = {"Computer Science"};
char *p = NULL; int i = 0 ;
p = a;
while(*p != '\0')
{
printf("%c\n",*p);
p = p+2;
}
return 0 ;
}
3.从终端接收一行字符串,利用指针遍历字符串统计大写字母、小写字母、空格及数组的个数
#include <stdio.h>
int main (void)
{
char a[32] = {0};
char *p = NULL;
p = a ;
int num1 = 0 ; int num2 = 0 ; int num3 = 0 ; int num4 = 0 ;
int i = 0;
gets(a);
while ( *p != '\0')
{
if(*p >= 'a'&& *p<='z')
{
num1++;
}
if(*p >= 'A'&& *p<='Z')
{
num2++;
}
if (*p == ' ')
{
num3++;
}
i++;
p++;
}
printf("num1=%d\n",num1);
printf("num2=%d\n",num2);
printf("num3=%d\n",num3);
printf("i=%d\n",i);
}
4.从终端接收一个字符串,使用指针对字符串遍历,统计字符串的长度(从开头到\0中间元素个数,不包含\0),不能使用strlen
#include <stdio.h>
int main (void)
{
char a[32] = {0};
char *p = NULL;
int i = 0;
gets(a);
p = a ;
while (*p != '\0')
{
i++;
p++;
}
printf("i = %d\n",i);
return 0 ;
5.从终端接收一个字符串,使用指针操作字符串将字符串拷贝到另一个数组中,不能使用strcpy
#include <stdio.h>
int main (void)
{
char a[32] = {0}; char b[32] = {0};
char *p = NULL; char *e = NULL;
gets(b);
p = a ; e = b;
while (*e !='\0')
{
*p = *e ;
p++;
e++;
}
puts(p);
return 0 ;
}
6.从终端接收两个字符串,使用指针实现两个字符串的拼接,不能使用strcat
#include <stdio.h>
#include <string.h>
int main (void)
{
char a[32] = {0}; char b[32] = {0};
char *p = NULL; char *x = NULL;
int len = 0 ;
gets(a);gets(b);
len = strlen(a);
p = a + len -1 ;
x = b;
while (*x != '\0')
{
*p = *x;
p++;
x++;
}
puts(a);
retrun 0 ;
}