Mô tả

Welcome to the "Advanced C Programming Masterclass: Pointers & Memory in C"! This best-seller course is designed to elevate your C programming skills, with a particular focus on the C language, topics related to embedded C, and advanced C.

Introduction

C programming language still remains one of the most popular and used languages in 2023 and has great career options in different industries, such as:

- Cyber Security.

- Smart Homes & Smart Cities.

- Drones.

- And especially in Embedded Systems.


What will you learn in this course?

There is an 'ancient' phrase saying "to become an expert in C - you need to master pointers".

One of the main objectives of this course is designed to take your basic knowledge of pointers (one of the most significant topics) to the next level. The goal is to take the basic skills you've gained so far in C programming and take this knowledge to a whole new level.

We will cover pointers, memory addressing, pointers to functions, advanced concepts of structs and dynamic memory allocation, and so much more.

The beauty of this course is that it regularly gets updated with new material. And the material being added to the course these days includes lots of information in the low-level programming (the bits and bytes), preparation for usage of Embedded C in Embedded Systems, and other very important topics for the next generation of engineers.

This course covers the topics in-depth, from different angles, and with various visualizations and illustrations - that should make the learning process of pointers and low-level programming much easier and fun for you.

Also, you will get a whole dedicated section on how to use a debugger and what is the debugging process that may help you so much in developing your future applications.

After completing this course you will gain plenty of new skills and knowledge that may improve your chances of getting a job position as a C Developer as well as increasing your chances to pass the exam (if you're still a student).


What's different about this course?

Vlad Budnitski will be your instructor for this course.

He has years of experience working as a Software Developer (also working with complex systems developed in C language). As well as 4 years of experience teaching C Programming for Beginners and Advanced C Programming in College.

So you got lucky on this one because you will get knowledge from a practical software developer and experienced instructor.

You will get a handpicked, concise, and straight to the point material that you will be amazed by the way these complicated pointers can be taught.

This course is also guided with concrete exercises, challenges, and full solution videos - that will help you to practice the materials.


Who's this course for?

First of all, this course is not for "absolute beginners" and it requires you to have at least the basic knowledge of programming. It's assumed you have some knowledge of the basics in C - preferably having completed our "C Programming for Beginners" course (here on Udemy).

This course is great both for students in college as well as graduates who need to learn and understand pointers in depth.

In addition, if you're planning to explore and master the Embedded Systems domain using Embedded C - then this course is a great preparation of various topics for the Embedded Domain. Once you master all the concepts of this course you'll be a few steps closer to proceeding and mastering Embedded Systems, programming Micro Controllers, etc.

So, once again, why this course?


  1. Investment of Time: We've spent hundreds of hours perfecting this course to make your C language learning experience engaging and fun.

  2. Best-Seller Status: Our course stands out among others. It's a top choice for learners due to its in-depth, easy-to-understand approach to complex C programming topics.

  3. Ease of Learning: Don't worry about getting confused or lost. We're experts at breaking down difficult concepts into easily digestible content.

  4. Staying Current: We keep our content fresh and relevant with constant updates and improvements. Currently, we offer over 40 hours of practical C programming content.

  5. Hands-On Training: Theory is good, but practice is better. We provide lots of exercises, complete with video solutions to help cement your knowledge.

  6. Community Support: Got questions or doubts? Our active Q&A community is here to provide answers and support your learning journey.


List of topics

Our course covers a wide variety of C programming topics including:


  • The ABCs of Pointersin C Language: From declaration, initialization, usage, to dereferencing and more

  • Unraveling Complex C Programming Concepts: Multiple indirection, pointer arithmetic, and generic pointers

  • Memory Management: Dive into dynamic memory allocation, using C functions like malloc, calloc, realloc, and free

  • Advanced C Topics: Learn about dangling pointers, using the Valgrind memory leak tool, sizeof operator, arrays, strings, and the secrets of using pointers in strings

  • Function Mastery: Grasp function pointers, arrays of pointers to functions, structs, and pointers

  • Debugging Skills: Enhance your problem-solving capabilities with debugger and debugging techniques in C

  • Further Exploration: Delve into 2D matrices with pointers, computer architecture, data and structs alignment, sequential and textual files, structural and binary files, and project management

  • Detailed Insights: Understand MACRO, Enums, Constants, Bitwise Operations (Embedded), and Bit Fields

  • And more!


Words From Our Students

Check out what our students have to say about their experience with us:


“The lecturer explains the material clearly and intelligibly. The teaching material is well developed. So far, so good!” - Andrejs Ogurcovs


“This course is amazing for embedded systems engineering. Inside of this course there are a lot of examples of curriculum also about pointers that makes it helpful for learning.Finally I have understood to pointers. I wıll use in embedded systems that i have learnt knowledge about c programming in this lecturer.Thanks for your effort Vlad. Best regards.” - Emre Çakır


“This course is AWESOME AWESOME AWESOME. I had so many courses for C, and all of them copied each other. They mention about pointers in just 1 (ONE) video (10 minutes). If you have a programming experience, start from this course. AWESOME AWESOME AWESOME. If I could have gave 1000 starts, I would do this. The examples, exercises, slides, topics, the voice of the teacher, everything is flawless” - beyza Erdoğan


“Having this opportunity to review C and Pointers is pretty awesome. I have learnt a lot from Vlad about C which could be regarded as the fundamental of almost every programming language. I have taken Vlad's course from C Bootcamp to this advanced pointer course, and now I am confident to say that I know about C because I understand pointers now!! Hoping there would be more algorithm contents in the future, thanks Vlad!” - Matsu Chen


“Hands down this is the best course I have ever done. Visual clarification was very useful for understanding what is happening behind the scenes. I hope Vlad makes extensions of this course with more advanced topics and exercises. Thanks Vlad!” - Venelin Stoyanov


“Vlad did a great job explaining, illustrating, and covering many essential topics in pointers with enough examples. After completing this course, I feel more confident in using pointers in c programming.” - Abdel Alkuor


“I did the first course C Programming Language for Beginners and I liked it. This course is in the same level or more until now. Thank you so much.” - João Henrique Berg dos Santos


“I struggled so much understanding pointers and how they work, and why do I need them, I also struggled with the dynamic memory allocation, but after that course I think everything cleared, and even if I am still not working perfectly with these things, I finally understood them and how they work. Thank you so much Vlad! It was pleasure watching your videos!” - Julia Vasileva


“Highly recommend taking this course for any student in college. Saved me so much time and effort. It was clearly explained, straight to the point, covered in a couple of hours more than my teacher covered in the entire semester.” - Nikolay


Do you still have doubts?

That's OK. Pointers can get us all confused to some extent... If you're still unsure if this course is exactly what you're looking for, feel free to go over the full detailed curriculum.

In addition, we offer a full money-back guarantee for 30 days. So, you can enroll risk-free today, and get ready to master the world of advanced C programming! We can't wait to start this journey with you.

Bạn sẽ học được gì

Introduction To Pointers For Beginners

Pointers Declaration, Initialization, and Usage

Pointers Dereferencing

Multiple Indirection

Pointers Arithmetics

Generic Pointers

Dynamic Memory Allocation

"malloc" function

"calloc" function

"realloc" function & "issues"

"free" function

Dangling Pointers

Memory Leakage Tool - Valgrind

Pointers Arithmetic

"sizeof" operator

Arrays & Pointers

Strings & Pointers

A few Secrets of Strings using Pointers

Function Pointers

Arrays of Pointers to Functions

Structs & Pointers

Debugger & Debugging

2D Matrix with Pointers

Introduction to Computer Architecture

Data & Structs Alignment

Sequential and Textual Files

Structural and Binary Files

Project Management

MACRO

Enums

Constants

Bitwise Operations (Embedded)

Bit Fields

Yêu cầu

  • Basic knowledge of C programming language - ideally having completed my "C Programming for Beginners" course on Udemy
  • A computer with Windows, Linux or Mac OS
  • At least 4GB RAM (recommended)

Nội dung khoá học

30 sections

Welcome Aboard!

3 lectures
Course Introduction
02:14
About the course
03:27
Quick Update: scanf & CRT - how to work with it?
04:12

Pointers - Introduction to Basics

10 lectures
Introduction to Pointers + General Visualization
07:55
Why using Pointers? [Reasons & Motivation]
12:55
Another reasons and motivation behind the usage of pointers
04:41
Declaration & Usage of Pointers
15:00
Pointers Initialization
04:18
Short Dereference
06:18
Challenge #1 - Printing Value & Address of a Variable
04:38
Challenge #2 - Guessing the Output
09:04
Exclusive Pass By Reference Guide
12:18
Quick Summary
03:34

Pointers Arithmetic & “sizeof” operator

8 lectures
Pointers Arithmetic Introduction
13:13
Pointers Arithmetic Examples
06:28
Rules - Summary
05:50
Pointers Arithmetic - DIY Exercises
02:22
The "sizeof" Operator - Introduction
04:06
The "sizeof" Operator - Basic Practice
03:02
"sizeof" & Static Arrays
03:23
"sizeof" & Pointers
14:46

Pointers Concept and Beyond

7 lectures
Exercise - Swap Function
04:21
Milestone #1 - Develop Your Real Swap Function!
02:50
Milestone #1 - Solution
07:54
Multiple Indirection
05:01
Generic Pointer (void star) - What is “void *”? [Generic Universal Pointer]
14:57
Generic Swap Function (including "memcpy" function)
21:53
Assignment: Implementing Different Data Swapping Techniques in C
5 questions

Arrays & Pointers - Theory & Practical Exercises

41 lectures
Arrays - Memory Representation
04:03
Passing an Array to a Function
08:34
Search if an Element is in a Given Array
11:45
Challenge#1 [Question]: Function to Find Maximum Value of an Array and Return it
01:06
Challenge#1 [Solution]: Function to Find Maximum Value of an Array and Return it
05:47
Challenge #2 [Question]: Calculates the Average Value of an Array (using 2 func)
02:20
Challenge #2 [Solution]: Calculates the Average Value of an Array (using 2 func)
08:59
Input & Print Functions - (useful for any given array)
08:25
Challenge #3 - Finding and Passing by Pointer - “Min” & “Max” values of an array
10:40
Challenge #3.1 [Additional] - Function to Update the Average by Reference
02:28
Challenge #3.1 [Solution] - Function to Update the Average by Reference
10:09
Challenge #4 - Does Array Has An Element With Good Neighbors - Question
04:26
Challenge #4 - Does Array Has An Element With Good Neighbors - Solution
05:09
Challenge #5 - Function To Find If Array Is Sorted Or Not - Question
04:26
Challenge #5 - Iterative Solution
18:39
Challenge #5 - Advanced Recursive Solution [Using Recursion & Functions]
18:04
Challenge #6 -Reverse Array using Pointers Arithmetic - Iter. & Recursive - Q.
02:28
Challenge #6 -Reverse Array using Pointers Arithmetic - Iter. & Recursive - S.
10:54
(old version) - Exercise - Reverse Array Using Recursion And Pointer Arithmetic
17:36
Challenge #7 - Count and Print the Frequency of Each Array's Element - Question
04:04
Challenge #7 - Count and Print the Frequency of Each Array's Element - Solution
15:18
Challenge #8 - Find & Return the "Second Smallest" Element - Question
01:39
Challenge #8 - Find & Return the "Second Smallest" Element - Solution
11:15
Challenge #9 - Find 2 specific elements in Sorted Array O(n^2) & O(n) - Question
05:33
Challenge #9 - Find 2 specific elements in Sorted Array O(n^2) & O(n) - Solution
09:00
Challenge #9 - Find 2 specific elements - Optimized Solution
10:43
ATTENTION! Problem with Returning a Static Array from a Function
12:12
Extra Practice #1 - Recursion - is Array of Integers a Palindrome - Question
03:50
Extra Practice #1 - Recursion - is Array of Integers a Palindrome - Solution
14:33
Extra Practice #2 - Exchanging Signs Array Recursively - Question
03:40
Extra Practice #2 - Exchanging Signs Array - Solution
17:32
Extra Practice #3 - Maximum of 2 Adjacent Elements (using pointers) - Question
03:04
Extra Practice #3 - Maximum of 2 Adjacent Elements (using pointers) - Solution
16:25
Extra Practice #4 - Print Array Elements using Pointers in C - Question
02:35
Extra Practice #4 - Print Array Elements using Pointers in C - Solution
12:38
Extra Practice #5 - Recursively using Pointers & Functions - Find Array Average
02:31
Extra Practice #5 - Recursively using Pointers & Functions - Find Average - Sol.
12:40
Extra Practice #6 - Adjacent Elements Parts Sorted in Floating Point Array - Q.
05:53
Extra Practice #6 - Adjacent Elements Parts Sorted in Floating Point Array - S.
10:14
Extra Practice #7 - Print Number in Binary using Recursion Function - Question
02:52
Extra Practice #7 - Print Number in Binary using Recursion Function - Solution
13:39

Arrays Swapping Exercises - Intermediate to Expert Questions!

4 lectures
Swapping in O(n) Complexity
08:59
Swapping in O(1) Complexity
08:55
SwapArray(O1) - Further Visualization & Additional Clarification - part 1
11:40
SwapArray(O1) - Further Visualization & Additional Clarification - part 2
05:33

Dynamic Memory Allocation

19 lectures
What is DMA and why we may need it?
08:33
“malloc" function
20:37
Challenge #1 - Creating and Returning a Dynamically Allocated Array from a Func
08:49
Challenge #2 - Print Dynamically Allocated Array
07:14
“calloc” function
08:23
“free” function
14:49
Dangling Pointer
07:59
Finding Memory Leakages [Valgrind]
05:36
“realloc” function
13:37
“realloc” issues
06:25
"realloc" - practical code example
17:39
Implementing your own “universal realloc function” - Question
06:48
Implementing your own “universal realloc function” - Solution #1
21:38
Implementing your own “universal realloc function” - Solution #2 - using memcpy
05:11
Adjustable Reallocation + Performance - Question
02:44
Adjustable Reallocation + Performance - Explanation & Solution
24:46
IMPORTANT Question - Create and Pass 1D Array using Pointer to Pointer!
02:56
IMPORTANT Solution - Create and Pass 1D Array using Pointer to Pointer!
14:34
Assignment: Mastering Dynamic Memory Allocation in C
6 questions

Advanced Exercises - Pointers & DMA

9 lectures
Exercise #1 - Creating a “new array” with NO DUPLICATES
30:24
Exercise #2 - Splitting “source array” into ODD and EVEN arrays
16:45
Exercise #3 - “Lower Case” & “Upper Case” arrays allocation
12:26
Advanced: Practical Universal Insert Function - Question
05:25
Advanced: Practical Universal Insert Function - Solution
20:15
Advanced: Practical Universal Remove Function - Question
02:29
Advanced: Practical Universal Remove Function - Solution
09:44
Question - Copy an Array and pass a new one by Reference
01:59
Solution - Copy an Array and pass a new one by Reference
10:33

2D Dynamically Allocated Arrays (Matrix)

16 lectures
Dynamic Matrix - Introduction
03:22
Arrays of Pointers - Introduction & Usage
14:54
Usage of Arrays of Pointers VS Static 2D Arrays
08:23
Creating a Totally Dynamically 2D Array
11:32
Developing the “allocate2DMatrix” function
14:05
Developing the “print2DMatrix” function
07:24
Developing the “freeMatrix” function
06:07
Practice Questions - 2D Dynamic Arrays - Question
06:54
Swap 2 rows in 2D Dynamic Array - using Universal Approach (solution)
16:15
Swap 2 columns in 2D Dynamic Array - for 2D Integer Arrays
07:21
Question - 2 functions - lower and upper triangle matrix functions
09:20
Solution - 2 functions - lower and upper triangle matrix creation
13:45
Question - write two functions to PRINT - lower and upper triangle matrix
04:06
Solution - 2 functions to print - lower and upper triangle matrix
07:57
Intermediate: 2D Matrix Allocation and Passing by Reference Function - Question
04:26
Intermediate: 2D Matrix Allocation and Passing by Reference Function - Solution
16:59

Strings & Pointers

2 lectures
Returning a string from a function - example with "strConcat"
10:10
**Exclusive** Extra Lecture on Strings & Pointers
18:51

String Library Functions Implementation - Using Pointers

5 lectures
Library Functions Implementation - Introduction
03:30
Finding String Length - Implementation in C (using pointers)
04:42
Concatenating 2 Strings - Implementation in C (using pointers)
13:16
Copying One String Into Another - Implementation in C (using pointers)
14:23
Comparing 2 Strings - Implementation in C (using pointers)
13:20

Debugger & Debugging - let's find out the problems!

7 lectures
Introduction to Debugging
06:10
Debugger & Debugging Process - Learning the Basics
13:39
Using Breakpoints Effectively
10:29
Viewing Memory Representation in a Debugger Mode.
14:41
Debugging & Pointers - easy memory representation
12:02
Arrays & Pointers Arithmetic (diving deeper with the debugging process)
08:04
Debugging - Strings & 2D Matrix
05:36

Structs - Basics & Beyond

6 lectures
Creating Arrays of Struct Variables in a Static Manner
14:52
Dynamically Allocated Array of Structs.
09:03
Passing structs to functions by value + Updating by Pointer
08:54
Structs Composition
11:29
Exercise: 2 functions to dynamically allocate an array of structs - Question
02:02
Exercise: 2 functions to dynamically allocate an array of structs - Solution
14:10

Project - School Management Systems - Using Structs & Pointers (New)

6 lectures
Project - School Management - Description & Requirements
02:43
Project - School Management - Developing the Project Together! Step-By-Step
01:10:16
System Simulation
39:23
School Management - Adding Functions for Freeing Dynamically Allocated Memory
15:42
Adding additional functions - Extending the Project
27:31
Project - School Management - Summary
06:57

Introduction to Computer Architecture & Data Alignment

5 lectures
Introduction to Memory, Architecture, and Alignment
03:19
Word & Architectures
11:23
Word Addressable VS Byte Addressable
07:31
Variables Alignment
14:35
Practical Checking Variables Addresses in Memory in IDE
09:31

Structs Alignment

12 lectures
Introduction to Padding (Data Alignment with Structs) - Structure Padding in C
14:21
Practical Struct Variable Memory Utilization
12:39
Example #1 - Struct Memory Utilization and Data Alignment (+padding)
09:44
Example #2 - Reorganizing Members Order and its Affect on Memory Utilization
06:20
Exercise #1 - Structs, Members Organization, Data Alignment and Memory - Quest.
01:36
Exercise #1 - Structs, Members Organization, Data Alignment and Memory - Sol.
03:00
Adding Data Member to Struct without Increasing the Size of a Variable in Memory
03:25
Exercise #2 - Structs, Members Organization, Data Alignment and Memory - Quest.
00:58
Exercise #2 - Structs, Members Organization, Data Alignment and Memory - Sol.
03:23
Data Alignment and Padding with Structs Composition
07:06
Tightly packing & Packing to not aligned data
06:59
Structs Alignment Practice Test
6 questions

Pointers to Functions

6 lectures
Function Pointers - Introduction
10:31
Problem Example - Motivation to use Functions Pointers
07:08
Declaration of Pointer to a Function
05:22
Coding Example with Pointers to Functions
08:59
Common Mistakes when using a Pointer to a Function
04:48
An array of Pointers to Functions
14:30

Function Pointers - Additional Content (New)

5 lectures
Exercise - Sorting an Array Using Function Pointers - Question
07:50
Exercise - Sorting an Array Using Function Pointers - Solution
20:09
Project - Pizza Making - A Delicious Use of Function Pointers - Question
12:43
Project - Pizza Making - A Delicious Use of Function Pointers - Solution
15:25
Using Function Pointers with Void Universal Pointers in C
26:26

Files - Sequential Files and Functions - Theory & Practice (new)

15 lectures
"remove" function - introduction
13:15
"remove" function - practical examples
07:14
"rename" function - introduction
10:11
"rename" function - practical exercise - question
05:24
"rename" function - practical exercise - solution
12:59
Functions for working and finding File's Location
18:12
Practical example - demonstrating the usage of ftell, fseek, and rewind function
12:10
Understanding .dat vs .txt Files
09:20
Exercise #1 - Function to Remove Space Characters - Question
02:35
Exercise #1 - Function to Remove Space Characters - Solution
10:23
Exercise #2 - Function to Split Odd Even Files - Question
03:03
Exercise #2 - Function to Split Odd Even Files - Solution
10:45
Exercise #3 - Function Comparing 2 Textual Files - Question
02:55
Exercise #3 - Function Comparing 2 Textual Files - Solution
11:27
Assignment: File Manipulation in C
5 questions

Files - Advanced Content - Structural/Binary Files

15 lectures
Common things to note when working with Sequential (Textual) files
16:22
Introduction to Structured Files
07:39
Writing a Structure Record to a File
09:17
Writing 2 Points read from the user to a file
07:52
Writing an array of points to a file.
09:14
Search for a specific point in a file. Reading.
10:18
Edit a specific point in the file
10:02
Multiply by 3 a specific point in the file
14:33
Challenge Reverse the Order of Points in a File - Question
06:21
Challenge Reverse the Order of Points in a File - Solution
11:29
Adding a Point to an Existing File
03:46
Challenge - Deleting a Point from the File - Question
06:18
Challenge - Deleting a Point from the File - Solution
14:39
Advanced Binary Student Records - Project - Question
07:04
Advanced Binary Student Records - Project - Solution
21:32

Project Management & MACRO (new)

2 lectures
Organizing and Managing Projects by using Header and Source Files
20:07
Macros - Theory & Practice
20:12

Enums

2 lectures
Enums - Part 1
09:56
Enum - Part 2
20:36

Constants & Pointers Masterclass

2 lectures
Constants - General Intro + Usage
13:01
Constants - Why & When + Example
16:04

Counting Arrays - Part #2 - Practice Exercises Function

10 lectures
Function - FreqAsValue - Question
05:37
Function - FreqAsValue - Solution
09:56
Function - FindDominantValue - Question
06:18
Function - FindDominantValue - Solution
10:36
Function - FindSpecificValueMaxSum - Question
05:57
Function - FindSpecificValueMaxSum - Solution
10:20
Function - FindLargestMissingValue - Question
06:25
Function - FindLargestMissingValue - Solution
11:43
Function - areAllCharactersIncluded - Question
07:25
Function - areAllCharactersIncluded - Solution
13:53

OPTIONAL: Introduction to Bitwise Operations [Embedded C Ready]

21 lectures
Introduction to Bitwise Operations + NOT operator
04:46
The AND bitwise operator
06:40
The OR bitwise operator
03:21
The XOR bitwise operator and its relation to TOGGLE
05:38
Using NOT, AND, OR, XOR in your own programming language
10:12
Demonstration in CC++ - Bitwise NOT, AND, OR, XOR
07:10
Introduction to Bit Masks
05:00
Finding the rightmost digit using a masking bitwise AND
09:22
Finding the leftmost digit using a masking bitwise AND
06:03
Finding specific combinations of bits in a value - using bit masking
10:14
Introducing the Masking Process to Set Specific bits using bitwise OR operator
06:21
Practicing Setting specific bits
04:57
Masking Process to Turn-Off Specific Bits using the AND bitwise operator
08:36
14. Introducing the XOR operator for Toggle Functionality
06:35
Shift Left & Shift Right Operators
12:59
Displaying a number in binary (using Bitwise Shift Operators) [Implementation]
16:35
Implementing Bitwise Right Rotation
14:23
Implementing Bitwise Left Rotation
05:57
Interview Level Question: Exercise - Implement Swap using Bitwise Operations
03:21
Solution - Implement Swap using Bitwise Operations - without THIRD VARIABLE
15:44
Assignment: Bitwise Operations in C
6 questions

Bit Fields in C (New)

8 lectures
Introduction to Bit Fields
02:31
How to use Bit Fields in C
06:00
Reading and Writing Bit Fields - Code Example
05:14
Practical Example Control Register using Bit Fields Struct
15:03
Updating the Control Register Bit Fields
04:20
Exercise - File Permissions - File System Info - Question
07:40
Exercise - File Permissions - File System Info - Solution
09:44
Bit Fields - Summary
04:37

Images, Pixels, and Binary Files (new)

5 lectures
Introduction to Images and Pixels
11:37
Gray Scale Image Representation
05:45
Gray Scale Image Representation - Basic Demonstration in C
11:37
RGB Image Representation
11:47
RGB Image Representation - Basic Demonstration in C
04:26

OPTIONAL: Basic Algorithms

4 lectures
Merge Functionality - General Introduction
13:16
Merge Functionality in C
19:04
Merge In Place - General Introduction - Basis for Merge Sort
07:08
Merge In Place - Practical Implementation - Part A
16:28

Practice Test: C Programming and Pointers

1 lectures
Practice Test: C Programming and Pointers
17 questions

Congratulations! You've made it! What's next?

1 lectures
Bonus Lecture
01:49

Đánh giá của học viên

Chưa có đánh giá
Course Rating
5
0%
4
0%
3
0%
2
0%
1
0%

Bình luận khách hàng

Viết Bình Luận

Bạn đánh giá khoá học này thế nào?

image

Đăng ký get khoá học Udemy - Unica - Gitiho giá chỉ 50k!

Get khoá học giá rẻ ngay trước khi bị fix.