vlambda博客
学习文章列表

C语言程序9:指针初识篇

C语言程序9:指针初识篇

Merry Christmas

C语言程序9:指针初识篇

指针初识


//指针初识

#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 = &num;

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;

}



我知道你在看

C语言程序9:指针初识篇




新浪微博:@秀米XIUMI