文章主要记录C语言的学习笔记。
指针:可以保存地址值(指针)的变量称为指针变量,因为指针变量中保存的是某变量的地址值。
指针的声明和使用
指针的声明一般形式为:
type *var_name; 在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。星号是用来指定一个变量是指针。声明的指针类型必须要与所指向的变量的类型一致。int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
实例:
#include<string.h>
#include<stdio.h>
const int MAX = 3;
int main(void)
{
int num = 18;
int* ap;
ap = #
printf("Value of num= %d\n", *ap);
printf("Value of num= %p\n", ap);
printf("Value of num= %p\n", &num);
printf("ap 存储大小 : %lu \n", sizeof(ap));
return 0;
}
指针与数组:
int array[10];
1、定义一个数组array[10],该数据类型可以理解为10个整型变量的集合,那么array表示的是指向该数组的起始位置,那么array的数据类型就是“指向int的常量指针”,如果声明的是其他类型的数组名,那么数据类型就是“指向其他类型的常量指针”。
2、对数组内的元素进行访问,可以互换的使用“指针表达式”或者“下表表达式”
但是,在编程的过程中注意array的值是一个常量地址,不能被修改,也不能被作为左值去被赋值。
实例:
#include<string.h>
#include<stdio.h>
const int MAX = 3;
int main(void)
{
int array[5] = {1,2,3,4,5};
int* ap;
ap = array;
for (int i = 0; i < 5; i++)
{
printf("Value of array[%d] = %d\n",i,*ap); //采用指针的方式进行访问
ap++; //指针可以被赋值,每次++表示向后移动了4个字节
printf("Value of array[%d] = %d\n",i,*(array + i)); //采用指针的方式进行访问,作为指针常量不能被赋值
printf("Value of array[%d] = %d\n",i,array[i]); //采用下标的方式进行访问
}
printf("ap 存储大小 : %lu \n", sizeof(ap));
printf("array 存储大小 : %lu \n", sizeof(array));
return 0;
}
指针作为形参传递给函数:
实例:指针作为形参传递给函数,若在函数内部指针所指向的地址的值被改变,相当于改变了函数外部实际的值,该函数传参方式为传址操作。也可以使用数组进行传址操作。
#include <stdio.h>
#include <time.h>
void swap(int* num1, int* num2)
{
int temp;
temp = *num1;
*num1 = *num2;
*num2 = temp;
}
int main()
{
int num1 = 5;
int num2 = 10;
swap(&num1, &num2);
/* 输出实际值 */
printf("Value of num1: %d\n", num1);
printf("Value of num2: %d\n", num2);
return 0;
}
函数指针和回调函数:
#include <stdio.h>
#include <time.h>
float Add(float num1, float num2)
{
float result = num1 + num2;
return result;
}
float Sub(float num1, float num2)
{
float result = num1 - num2;
return result;
}
float mult(float num1, float num2)
{
float result = num1 * num2;
return result;
}
float Div(float num1, float num2)
{
float result = num1 / num2;
return result;
}
void calc(float num1, float num2, float(*pFuction)(float, float))
{
float result = pFuction(num1, num2);
printf("Value of Calc = %f\n", result);
}
int main()
{
float num1 = 5.5;
float num2 = 10.36;
calc(num1,num2, Add);
calc(num1, num2, Sub);
calc(num1, num2, mult);
calc(num1, num2, Div);
return 0;
}
White Board:const char* prt ,char const *prt ,char *const prt ,const char *const prt 的区别。
const char*prt :表示为定义一个指向常量的指针,可以指向常量也可以指向变量,*prt不可通过指针去修改,prt可以被改变,重新指向一个新的常量地址。(char const *prt 一样)
const char*prt = array:表示为定义一个指向char类型的常量指针,定义的时候必须被初始化,prt被const所修饰,故prt不可被修改,但可以通过指针prt去修改所指向的数据*prt。
const char*const prt = array:表示不予许prt被修改,也不予许修改prt所指向的数据。