什么是指针
- 指针是内存中一个最小单元的编号,也就是地址
- 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
指针变量
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个
变量就是指针变量
#include <stdio.h>
int main() {
printf("%d\n",sizeof(char *));//结果位8因为我的计算机是64位操作系统
printf("%d\n",sizeof(short *));
printf("%d\n",sizeof(int *));
printf("%d\n",sizeof(double *));
return 0;
}
指针和指针类型
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
char* 类型的指针是为了存放 char 类型变量的地址。
short* 类型的指针是为了存放 short 类型变量的地址。
int* 类型的指针是为了存放 int 类型变量的地址。
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)。
char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节
指针做加法
#include <stdio.h>
int main() {
int n = 10;
int * pn = &n;//传递地址然后进行加法操作
*pn = *pn+1;
printf("%d\n",n);
}
指针的解引用
#include <stdio.h>
int main() {
int arr[10]={0};
int * parr = arr;
for (int i=0;i<10;i++){
parr[i]=i+1;
}
for(int j=0;j<10;j++){
printf("%d\n",arr[j]);
}
}
野指针
#include <stdio.h>
int main()
{ //这里p为野指针
int* p; //p是一个局部变量(在{}里的变量为局部变量),局部变量不初始化默认是随机值。
*p = 10; //非法访问内存。
return 0;
}
数组名其实就是一个指针
#include<stdio.h>
int main(){
int arr[10]={0};
int * parr = arr;//将数组传递给一个指针变量
for(int i=0;i<10;i++){
parr[i]=i+1;
}
for(int j=0;j<10;j++){
printf("%d\n",arr[j]);
}
return 0;
}
换种写法而已
#include <stdio.h>
int main(){
int arr[10]={};
int * p=arr;
for (int i=0;i<10;i++){
*(p+i)=i+1;//另外一种写法而已
}
for(int j=0;j<10;j++){
printf("%d\n",arr[j]);
}
return 0;
}
字符指针
#include <stdio.h>
int main(){
char ch = 'q';
char *pc = &ch;
*pc = 'w';
printf("%c\n",ch);
return 0;
}
字符指针使用和遍历
#include <stdio.h>
#include<string.h>
int main(){
char * str = "sdfsfdsfsd";
int strLen = strlen(str);
for (int j=0;j<strLen;j++){
printf("%c\n",str[j]);
}
}
函数操作
一维数组作为参数传递-必须有数组大小
void test(int arr[],int size){
for(int i=0;i<size;i++){
printf("%d\n",arr[i]);
}
}
int main(){
int arr[]={1,2,3,4,5,6,9};
int size = sizeof(arr)/sizeof(arr[0]);
test(arr,size);
}
二维数组传参
#include <stdio.h>
#include<string.h>
void test(int (*arr)[3]){
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
printf("j=%d\t",arr[i][j]);
}
printf("%\n");
}
}
int main(){
int arr[2][3]={{1,2,3},{4,5,6}};//二维数组第一维度里面其实就是地址
test(arr);
}
三维数组传递
#include <stdio.h>
void test( int (*arr)[2][2]){//三维数组传递
for (int i=0;i<3;i++){
for(int j=0;j<2;j++){
for(int m=0;m<2;m++){
printf("%d\n",arr[i][j][m]);
}
}
}
}
int main(){
int arr[3][2][2]={{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}};
test(arr);
return 0;
}
如果多为数组类似传递
数组使用指针作为函数参数传递
函数传递使用一级指针大小需要传递
#include <stdio.h>
#include<string.h>
void test1(int * arr){
for(int j=0;j<10;j++){
printf("%d\n",arr[j]);
}
}
int main(){
int arr[10]={0};
for(int i=0;i<10;i++){
arr[i]=i+1;
}
test1(arr);
}
标签:arr,main,int,C语言,char,第五篇,include,指针
From: https://www.cnblogs.com/zh718594493/p/18187772