
有关C语言的电子书资源,其中介绍了c指针的内容,基本概念,核心技术和最佳实践. 该书由机械工业出版社以PDF格式出版,资源大小为39 MB,由Navien Tuopu撰写,该书目前在豆瓣,亚马逊,当当网,京东等电子书的综合评分为7.3.

C指针: 基本概念,核心技术和最佳实践电子书封面
读者评估
C指针: 基本概念,核心技术和最佳实践,不错的书,您可以对C语言指针有更多的了解!
内容介绍
这本书首先介绍了内存和实时内存的概念,然后讨论了指针变量的概念及其重要操作(引用和取消引用),指针算术和一维数组,处理字符串的指针和访问多维数组的指针的用法,使用访问结构和成员字段的指针,函数指针概念的用法,以及文件I / O处理知识.
内容摘录
C语言指针的详细说明和用法示例
新手在C语言学习过程中遇到的最麻烦的知识点应该是指针. 指针在C语言中非常有用. 下面,我将写下我对带有问题的指针的一些理解.

什么是指针?
指针本身是一个变量,它将数据的地址存储在内存中,而不是数据本身的值. 其定义如下:
int a=10,*p; p=&a int a=10; int *p=&a;
首先,我们可以理解int *是定义一个指针p,然后由于该指针存储了一个地址,我们需要取a的地址(&)并将值赋给指针p,即是,指针p指向a.
很多新手会对这两种定义方法感到困惑,实际上,它们的意思是相同的. 第一种定义方法定义一个int变量a和一个指针p,然后将a的地址分配给p. 第二种是在定义指针p的同时将a的地址分配给指针p. 我们先了解一下“ int *”是定义指针的符号.
指针的用途是什么?
通过这种方式,我们可以通过* p找到指针指向的变量a的地址,然后对该地址中的值进行操作(值为10).
//接着上面的代码
printf("%p",p) //结果是一个地址(p指向的变量a的地址)。
printf("%d",*p) //结果是10,变量a的值。
printf("%d",&p) //结果是一个地址(指针p的地址,因为指针也是一个变量自己也有地址的)
数组名称和指针有什么区别?
数组名称是一个地址,可以理解为常量指针(它只能指向该数组第一个元素的地址). 指针可以引用其他变量,依此类推.

int str[5]={1,2,3,4,5};
int *p=str;
printf("%d",*p); //输出为1,数组的首元素。
printf("%d",*str); //输出为1,数组的首元素。
printf("%d",str[0]); //输出为1,数组的首元素。
printf("%p",p); //输出为地址,数组的地址。
printf("%p",str); //输出为地址,数组的地址。
printf("%d",*(p+1)); //输出为2,数组的第二个元素。
printf("%d",*(srt+1)); //输出为2,数组的第二个元素。
通过比较代码,您可以清楚地看到对存储在内存中的数据进行数组名称操作的方法和结果相同,但是数组名称存储数组本身的第一个地址.
什么是空指针和通配指针?
在函数内部分配了指针之后,该指针将在执行函数后变为空指针(变量从堆栈中弹出). 但是通过动态地址(堆空间)分配的指针不会出现上述问题.
在free(p)之后释放内存的指针是一个野生指针.
关于const对指针的限制
int a=10,b=20; int * const p=&a; //无法使p指向其他地址。 p=&b; //这样的操作是不允许的。 *p=20; //可以这样操作。 const int * p=&a; //p可以指向其他地址。 p=&b; //可以操作。 *p=10; //操作不被允许。 const int * const p=&a //p不能指向其他地址,也不能改变地址中的值。 p=&b; //操作不被允许。 *p=20; //操作不被允许。
const位于int的左侧,也就是说,您不能修改地址中的值,在右侧,您不能指向其他地址,而在左侧和右侧,即您都不能修改该值地址,也不要指向其他地址.
我经常为新手总结以上几点. 如果出了问题,希望您能留言并互相学习. 多维数组的存储方法和指针的问题将在以后编写.
下面是对c语言中指针的几种用法的简要介绍.

1. 指向变量的指针:
下面有这样的代码块:
int main()
{int a=10;int b=15;test(a,b);printf("a=%d,b=%d\n",a,b);}
void test(int x,int y)
{int tmp;tmp=x;x=y;y=tmp;}
最终输出仍然是a = 10,b = 15. 因为在函数调用中,实际参数和形式参数仅按值传递. 但是我们使用指针的结果是不同的,例如:
int main()
{int a=10;int b=15;test(&a,&b);printf("a=%d,b=%d\n",a,b);return 0;}
void test(int * x,int *y)
{int tmp;tmp=*x;*x=*y;*y=tmp;}
输出结果a = 15,b = 10. 变量a和b的值被交换. 这是因为我们使用指针访问变量的存储单元并间接修改变量的值.
2. 指针指向数组:
定义一个数组并对其进行初始化,即int array [5] = {2,5,12,7,8},定义一个指针变量并为其分配数组的地址,int * p = array,请注意数组名称是数组的地址,而数组的地址是第一个元素的地址. 因此,我们的指针变量指向数组的第一个元素* p = 2. 如果放(p + 1),则指针变量指向数组5的下一个元素,因此我们可以使用指针遍历数组的每个元素:
int main()
{int array[5]={2,5,12,7,8};int *p =array;for(int i=0;i<5;i++){printf("array[%d]=%d\n",i,*(p+i));}return 0;}
3. 指针指向一个字符串:

我们都知道使用数组来存储字符串,例如char name [20] =“ jack”. 指向数组的指针已在上面进行了简要说明c 语言 指针,因此我们可以执行此操作,char * name =“ jack”,指针变量指向字符,该字符是字符串的第一个字符,并且可以依次访问字符串的每个字符.
4. 功能指针:
我们需要知道如何表示一个函数的指针. 坦率地说,语法必须正确. 让我也以一个代码块来解释:
int sum(int x,int y)
{return x+y;}
int main()
{int a=5;int b=6;int (*p)(int,int);p=sum;int result=(*p)(a,b);printf("The result is %d\n",result);return 0;}
不难发现上面的代码块中的语句(* p)(a,b)可以被p(a,b)代替,因为p和sum相同,但是可能更容易了解前者. 而且我们需要知道如何定义一个指向函数的指针. int(* p)(int,int)这是固定的措词. 前一个int是指针将来指向的函数的返回值的类型. 如果没有函数返回值,则为void,括号中的两个整数当然是指针将指向的函数的形式参数. 指向该函数的指针确实有点抽象,如果您想熟练地使用它,则应在此区域进行更多练习!
5. 指针指向结构:
我们首先定义一个结构类型,
struct student
{
char *name;
int ages;
};
然后根据类型定义结构变量struct student stu = {“ Rose”,15};定义一个指向结构类型的指针,结构学生* p;将结构变量stu的地址分配给指针变量pc 语言 指针,p =&stu;有3种方法可以访问结构中的属性:
stu.ages = 15;(* p).ages = 15; p-> ages = 15;但是,第三种方法只能用于指向C语言中的结构.
总而言之,指针的基本用法是这些类型,某些用法不常见的编辑器只是这里的一个示例. 如果您有兴趣,可以查看相关信息.
目录
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-243043-1.html
不会是竞争对手
中国动作太快了