C语言程序9:指针初识篇
Merry Christmas
指针初识
//指针初识
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
/*
1.什么是指针?
特点: 整数
1.2 指针变量
1.2.1 定义一个指针 //类型 变量名;
类型 *变量名;
1.2.2 指针变量的打印
No.1 %d --->他是一个整数
No.2 %p --->十六进制打印 指针专用打印方式
1.4 指针变量初始化: 指针如何充当变量的使用
int a;
int *p=&a;
2.3个贰
2.1 指针的两个类型
int *p;
2.1.1 指针的类型 去掉变量名;
int *:指针的类型
2.1.2 指针所指向的类型:对应内存当中存储的数据类型 : 去掉变量名和*
int:指针所指向的类型
2.2 指针的两个原则
2.2.1 和变量一样,使用前必须初始化原则
2.2.2 类型一致原则:指针的类型和指针的所指向的类型的一致性
2.2 指针的两个运算
2.2.1 取值运算
2.2.2 指针的加减运算: 没有学习数组之前没有任何作用
目的:为了操作一段连续内存
NO.1 不同类型的指针内存占用情况:都只占用4个字节。
No.2 p+n操作? //n:表示字节
实际上是: p+(sizeof(指针所指向的类型)*n)
减法同理:p-n //p-(sizeof(指针所指向的类型)*n)
2.3 所有指针都只占用4个字节,因为指针存储的都是整数。
*/
int main()
{
int a = 1;
int b = 2;
//不同类型的指针--->指针都是整数
char *pChar=NULL;
int *pInt=NULL;
float *fChar=NULL;
//书写方式:在后面和在前面都OK
int* ppChar = NULL;
//pA才是变量 *pA 是指针变量的使用
int *pA = &a;
//int *pNum = NULL;//写入位置 0x00000000 时发生访问冲突。
//error C4700: 使用了未初始化的局部变量“pNum”
//int *pNum; //没有内存(没有进行初始化),就不能存放数据
//*pNum = 123;//不能存放数据
int num = 1;
int *pNum = #
printf("%d\n", *pNum);//*pNum等效于num
*pNum = 1003;
printf("%d\n", num);
num = 11;
printf("%d\n", *pNum);
printf("%d\n", pNum);
printf("%d\n", &num);
printf("%d\t,%d\t,%d\t,%d\n", sizeof(int *), sizeof(char*), sizeof(float *),sizeof(double *));//都是4个字节。
int *ppInt = NULL;//00000
printf("NULL:%p\n", NULL);
printf("int+1:%p\n", ppInt + 1); //p+sizeof(int)*1; //pplnt + 1 :1表示偏移字节数
char *pppChar = NULL;
printf("char+1:%p\n", pppChar + 1);//p+sizeof(char)*1
double *pDouble = NULL;
printf("pDouble+1:%p\n", pDouble + 1);//p+sizeof(double)*1
printf("%d\n", sizeof(short));
int mem;
int *pMemory;
pMemory = &mem;
scanf("%d", pMemory); //初始化 *pMemory
printf("%d\n", *pMemory);
//sizeof(类型) 统计类型所占用字节数
//sizeof(int*) 统计指针变量的类型 (int*)占用字节数
//sizeof(int) 统计int类型占用字节数
system("pause");
return 0;
}
//一级指针与一维数组
#include <stdio.h>
#include <stdlib.h>
/*
一级指针与一维数组
1.数组名
No.2 不能被修改
No.3 当指针绑定一段内存的时候,sizeof统计的是一段内存
No.4 常属性的,不可改变,但是可以使用
2.数组的指针法表示
2.1 数组名的指针法
array+i 等效于&array[i];
*(array+i)等效array[i];
2.2 用第三方指针操作数组
No.1 常规操作大家都要会 类似数组名的用法
No.2 非常规的初始化大家要会分析
*/
int main()
{
int array[4] = { 1, 2, 3, 4 };
printf("array:%d\t,&array[0]:%d\n", array,&array[0]);
printf("sizeof(array):%d\n", sizeof(array)); //统计的是整个数组占的字节数
for (int i = 0; i < 4; i++)
{
printf("%d:%d\t", array + i,*(array+i));
}
printf("\n");
//以下两种等效
int *p = &array[0]; //不写
int *pp = array;
//剩下的就是,按照数组的的用法即可
for (int i = 0; i < 4; i++)
{
printf("%d:%d\t", p + i, *(p + i));
}
printf("\n");
//用指针操作数组的时候,要使用的值,更倾向于数组的写法
for (int i = 0; i < 4; i++)
{
}
printf("\n");
int arrayInt[4] = { 1, 2, 3, 4 };
int *ppp = arrayInt + 2;
printf("%d\n", ppp[1]);
//指针法可以优化写法
//int num[3] = { 0 };
//for (int i = 0; i < 3; i++)
//{
////num+i 等效于&num[i]
//scanf("%d", num + i);
//}
//便于去使用指针修改
int *pNum = arrayInt;
while (pNum <= arrayInt + 3 && *pNum != 3)
{
pNum++;
} //弊端?弊端没有找到的未做处理
*pNum = 1003;
printf("%d\t", arrayInt[2]);
printf("%d\t", arrayInt[3]);
system("pause");
return 0;
}
//内存四区与指针的理解
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *pStr = "ILoveyou"; //常量区,不允许修改
//0xC0000005: 写入位置 0x00285858 时发生访问冲突。
//*pStr = 'M';
printf("%s\n", pStr);
char array[] = "ILoveyou";
pStr = array;
printf("%c\n", *pStr);
printf("%s\n", pStr);
*pStr = 'M';
printf("%s\n", pStr);
//经典问题
char *ppStr = NULL;
ppStr = "ILoveyou!!!"; //如果是*ppStr就不能赋值!
printf("%s\n", ppStr);
//字符串连接:连接两数组
char str1[50] = "ILoveyou ";
char str2[] = "IMissYou";
char *p1 = str1;
char *p2 = str2;
while (*p1 != '\0')
{
p1++;
}
while (*p2 != '\0')
{
*p1++ = *p2++;
}
printf("%s\n", str1);
//字符串拷贝操作
char str[] = "IMissyou";
char str0[] = "ILove";
p1 = str;
p2 = str0;
while (*p2 != '\0')
{
*p1++ = *p2++;
}
//字符串结束标记没有处理
*p1 = '\0';
printf("%s\n", str);
system("pause");
return 0;
}
//二级指针
#include <stdio.h>
#include <stdlib.h>
/*
二级指针:主要用在函数参数中
定义: 类型 **指针变量名;
*/
int main()
{
char *pStr = "ILoveyou";
int a = 1;
int *p=NULL;
printf("%d\n", **pp);
system("pause");
return 0;
}
//空类型指针
#include <stdio.h>
#include <stdlib.h>
/*
万能指针:
void * 的指针
2.使用的时候(用值的时候) 必须强制转换
void * 指针特点:使用前必须强制转换
3.有什么用?
3.1 传任何类型的参数
3.2 返回值可以复制给任何东西
*/
int main()
{
int a = 1;
void *p = &a;
printf("%d\n", *(int *)p);
*(int *)p = 1002;
printf("%d\n", a);
a = 'A';
printf("%c\n", *(char *)p);
system("pause");
return 0;
}
我知道你在看哟
新浪微博:@秀米XIUMI