目录
前言
指针是c语言中一个十分重要的概念,也是c语言的重要特色,正确而灵活地运用指针,可以使程序简洁,紧凑,高效。利用指针变量不仅可以有效地表示各种数据结构,也可以用于参数传递和动态分配空间。本人每天不定时分享一些自己的学习经验和一些32的项目。
一.指针变量
存放地址的变量是指针变量,它用来指向另一个对象(如变量,数据,函数,结构体等)。、
指针是一个变量的地址;指针变量是专门存放变量地址的变量;
1.指针变量的定义形式:
数据类型 *指针变量名;
int *p1;
注:“ *p1 ”代表指针p1所指单元的内容;“p1 ”则代表指针变量;
2.指针变量的引用:
在引用指针变量时,主要有两种情况:
Ⅰ.给指针变量赋值:
p=&a
指针变量p的值是变量a的地址。
Ⅱ.引用指针变量指向变量:
printf("%d\n",*p);
以整型的形式输出指针变量p所指向的变量的值。
注:&是取地址符,&a代表是变量a的地址。
二.地址与地址内容的概念
1.地址:
地址是内存中每个字节单元的唯一标识。在计算机的内存中,每个存储位置(比如一个字节)都有一个地址,就像现实中的门牌号一样。在C语言中,地址通常用十六进制数表示,可以通过取地址运算符 &
来获得任何变量或数据的地址。
int var = 10;
printf("变量var的地址是:%p\n", (void*)&var);
这里的 %p
是用于打印地址的格式化字符串,(void*)&var
是获取变量 var
的地址。
2.地址内容:
地址中的内容指的是存储在特定内存地址处的数据。在C语言中,可以通过解引用指针来访问地址中的内容,使用运算符 *
来实现。
int var = 10;
int *ptr = &var; // ptr是指向var的指针,存储了var的地址
printf("地址中的内容是:%d\n", *ptr); // 解引用指针,获取地址中的内容
在这个例子中,*ptr
会给出指针 ptr
所指向地址(即变量 var
的地址)中的内容,也就是数值 10
。
三.经验总结和习题分享
1.经验总结:
学习指针的经验总结:理解指针的本质是内存地址的引用,通过从基础概念入手,循序渐进地练习指针与数组、函数的交互,并在实践中不断调试和反思,可以有效提升对指针操作的熟练度和深度,进而掌握C语言的核心技能。
2.习题分享:
Ⅰ.交换两个整数的值
编写一个函数,使用指针参数交换两个整数的值。
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 10, y = 20;
printf("交换前:x = %d, y = %d\n", x, y);
swap(&x, &y);
printf("交换后:x = %d, y = %d\n", x, y);
return 0;
}
Ⅱ.使用指针访问数组元素
编写一个程序,使用指针访问并打印数组中的所有元素。
#include <stdio.h>
void printArray(int *arr, int size) {
for (int i = 0; i < size; i++) {
printf("%d ", *(arr + i));
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int size = sizeof(arr) / sizeof(arr[0]);
printArray(arr, size);
return 0;
}
Ⅲ.字符串反转
编写一个函数,使用指针反转一个字符串
#include <stdio.h>
#include <string.h>
void reverseString(char *str) {
int len = strlen(str);
for (int i = 0; i < len / 2; i++) {
char temp = str[i];
str[i] = str[len - i - 1];
str[len - i - 1] = temp;
}
}
int main() {
char str[] = "Hello, World!";
printf("原始字符串: %s\n", str);
reverseString(str);
printf("反转后的字符串: %s\n", str);
return 0;
}
Ⅳ.动态内存分配
编写一个程序,使用malloc和free动态分配和释放内存。
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(5 * sizeof(int)); // 分配5个整数的空间
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
// 使用分配的内存
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
// 打印分配的内存内容
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
printf("\n");
// 释放内存
free(ptr);
return 0;
}
Ⅴ.指针作为函数返回值
编写一个函数,返回一个指向整数的指针。
#include <stdio.h>
int* createPointerToInteger() {
int value = 100;
return &value; // 注意:返回局部变量的地址是不安全的
}
int main() {
int *ptr = createPointerToInteger();
printf("指针指向的值是:%d\n", *ptr);
// 注意:这里访问的值可能是不确定的,因为函数返回的局部变量的地址在函数返回后不再有效
return 0;
}
Ⅵ.指针数组和指向指针的指针
编写一个程序,使用指针数组来存储字符串,并使用指向指针的指针来访问这些字符串。
#include <stdio.h>
int main() {
char *names[] = {"Alice", "Bob", "Charlie"};
char **ptr = names; // 指向指针数组的指针
for (int i = 0; i < 3; i++) {
printf("%s\n", *(ptr + i));
}
return 0;
}
Ⅶ.动态分配二维数组
编写一个程序,使用malloc动态分配一个二维数组,并使用指针来访问和打印数组的内容。
#include <stdio.h>
#include <stdlib.h>
int main() {
int rows = 3;
int cols = 4;
int **array = (int **)malloc(rows * sizeof(int *));
for (int i = 0; i < rows; i++) {
array[i] = (int *)malloc(cols * sizeof(int));
}
// 初始化二维数组
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
array[i][j] = i * cols + j;
}
}
// 打印二维数组
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", array[i][j]);
}
printf("\n");
free(array[i]); // 释放每一行的内存
}
free(array); // 释放指向行的指针数组的内存
return 0;
}
------------------每天不定时分享,如果对你有帮助就点点关注吧,大佬们!!!!!!----------------