0
点赞
收藏
分享

微信扫一扫

C语言变量和指针


男孩和青春只限于校园,踏出校园就要当成熟稳重的男人。。。

----  网易云热评

一、变量

非静态局部变量的作用域是函数里面的所有语句, 生命周期是函数某一次执行的时间

静态局部变量的作用域是函数里面的所有语句, 生命周期是没有限制的

静态全局变量的作用域只包含它所在文件里的所有语句,生命周期也是没有限制的

非静态全局变量的作用域和生命周期都是没有限制的

#include <stdio.h>

int val1 = 0; //非静态全局变量

static int val3 = 0; //静态全局变量

int main() {

int val = 0; //非静态局部变量

static int val2 = 0; //静态局部变量

return 0;

}

 

#include <stdio.h>

//这个函数可以用来计算多个数字的和

int sum(int val) {

static int ret = 0; //静态变量的初始化只在程序开始的时候执行一次,和这条语句所在的位置无关

ret += val; //每次ret变量里都保留上一次sum函数结束时的内容

return ret;

}

int main() {

int num = 0;

for (num = 1;num <= 5;num++) {

printf("%d\n", sum(num));

}

return 0;

}

二、指针

1、指针变量

#include <stdio.h>

typedef int *pint_t; //给整数类型指针起名字叫pint_t,以后就可以在程序里用pint_t代表指针类型

int main() {

int val = 0;

int *p_val = &val, *p_val1 = NULL/*空地址*/; //*表示变量是一个指针变量

//pint_t p_val, p_val1; //声明两个整数类型指针

p_val = &val; //把val变量存储区的地址赋值给指针p_val,可以认为以后指针p_val就指向了变量val

*p_val = 10; //指针变量名称前使用*操作符可以表示指针指向的变量(存储区)

printf("val是%d\n", val);

return 0;

}

2、交换数据

#include <stdio.h>

int main() {

int val = 3, val1 = 7;

int *p_val = &val, *p_val1 = &val1; //声明两个指针分别指向这两个整数变量

/*val ^= val1;

val1 ^= val;

val ^= val1;

printf("val是%d,val1是%d\n", val, val1);*/

*p_val ^= *p_val1;

*p_val1 ^= *p_val;

*p_val ^= *p_val1;

printf("*p_val是%d, *p_val1是%d\n", *p_val, *p_val1);

return 0;

}

3、判断大小

#include <stdio.h>

int main() {

int val = 0, val1 = 0, val2 = 0;

int *p_min = &val; //p_min指针永远指向最小数字所在的存储区

printf("请输入三个数字:");

scanf("%d%d%d", &val, &val1, &val2);

if (*p_min > val1) {

//处理val1里的数字比val更小的情况

p_min = &val1;

}

if (*p_min > val2) {

//val2变量里的数字更小

p_min = &val2;

}

printf("最小数字是%d\n", *p_min);

return 0;

}

4、指针加减运算

#include <stdio.h>

int main() {

int arr[] = {1, 2, 3, 4, 5};

int *p_val = arr;

int num = 0;

printf("arr是%p\n", arr);

printf("arr + 1是%p\n", arr + 1);

printf("arr - 1是%p\n", arr - 1);

for (num = 0;num <= 4;num++) {

printf("%d ", arr[num]);

printf("%d ", *(arr + num/*得到下标为num存储区的地址*/)/*下标为num的存储区*/);

printf("%d ", *(p_val + num/*得到下标为num存储区的地址*/)/*下标为num的存储区*/);

}

printf("\n");

printf("&arr[3] - arr是%d\n", &arr[3] - arr); //结果是3,表示两个地址之间包含3个整数类型存储区

return 0;

}



arr是00EFFBAC

arr + 1是00EFFBB0

arr - 1是00EFFBA8

1 1 1 2 2 2 3 3 3 4 4 4 5 5 5

&arr[3] - arr是3

 

5、指针加1,相当于加该数据类型的大小

#include <stdio.h>

int main() {

int arr[] = {1, 2, 3, 4, 5};

int *p_tmp = NULL;

for (p_tmp = arr;p_tmp <= arr + 4/*最后一个存储区的地址*/;p_tmp++) {

printf("%d ", *p_tmp);

}

printf("\n");

return 0;

}

6、const关键字

#include <stdio.h>

int main() {

int val = 0;

const int *p_val = &val; //不可以通过这种指针对它指向的存储区做赋值操作

int * const p_val1 = &val; //不可以对这种指针本身做赋值

//*p_val = 10; 错误

p_val = NULL;

*p_val1 = 10;

//p_val1 = NULL; 错误

return 0;

}

 

7、无类型指针

#include <stdio.h>

int main() {

char ch = 'e';

int val = 34;

float fval = 6.3f;

void *p_v = NULL; //无类型指针

p_v = &ch; //无类型指针指向字符类型存储区

printf("%c\n", *(char *)p_v);

p_v = &val;

printf("%d\n", *(int *)p_v);

p_v = &fval;

printf("%g\n", *(float *)p_v);

return 0;

}

8、指针参数

#include <stdio.h>

void print(const int *p_val/*数组形参的本质就是一个指针*/, int size) {

int num = 0;

for (num = 0;num <= size - 1;num++) {

printf("%d ", *(p_val + num));

}

printf("\n");

}

int main() {

int arr[] = {1, 2, 3, 4, 5};

print(arr, 5);

return 0;

}

9、返回值为地址

#include <stdio.h>

int * /*指针类型存储区用来存放作为返回值的地址*/read(void) {

static int val = 0;

printf("请输入一个数字:");

scanf("%d", &val);

return &val;

}

int main() {

int *p_val = read();

printf("数字是%d\n", *p_val/*表示read函数里val变量存储区*/);

return 0;

}

 

10、通过指针判断大小

#include <stdio.h>

int *max(const int *p_val, int size) {

const int *p_max = p_val; //为了和p_val指针一致所以声明的时候需要使用const关键字

const int *p_tmp = NULL;

//指针循环变量从第二个存储区开始一直

//指到最后一个存储区为止

for (p_tmp = p_val + 1;p_tmp <= p_val + size - 1;p_tmp++) {

if (*p_tmp > *p_max) {

//当前存储区内容比p_max指针指向的

//存储区内容还大

//这个时候当前存储区更有资格

//成为最后的结果

p_max = p_tmp; //p_max指针指向当前存储区

}

}

return (int *)p_max;

}

int main() {

int arr[] = {40, 80, 30, 60, 20, 50};

int *p_max = max(arr, 6);

printf("最大数字是%d\n", *p_max);

return 0;

}

 

11、交换数组里面的数值

#include <stdio.h>

int * /*用返回值代表处理结果*/reverse(int *p_val, int size) {

int *p_head = p_val; //永远指向配对存储区中前面的那个,开始时指向第一个存储区

int *p_tail = p_val + size - 1; //永远指向配对存储区里后面那个存储区,开始时指向最后一个存储区

//每循环一次把一对配对存储区的内容

//做交换

while (p_head < p_tail) { //两个指针既没有相遇也没有交错

//把两个指针指向的存储区内容做交换

//就可以了

*p_head ^= *p_tail;

*p_tail ^= *p_head;

*p_head ^= *p_tail;

p_head++; //p_head指针指向下一对存储区

//里前面那个

p_tail--; //p_tail指针指向下一对存储区

//里后面那个

}

return p_val; //把数组里第一个存储区的地址做返回值

}

int main() {

int arr[] = {1, 2, 3, 4, 5, 6};

int num = 0;

reverse(arr, 6);

for (num = 0;num <= 5;num++) {

printf("%d ", arr[num]);

}

printf("\n");

return 0;

}

 

 

 

C语言变量和指针_变量

 

 

举报

相关推荐

C指针变量定义

C语言笔记:数组和指针

0 条评论